[ruby-netcdf] 05/07: Refresh patches
Youhei SASAKI
uwabami-guest at moszumanska.debian.org
Thu Jul 30 10:56:45 UTC 2015
This is an automated email from the git hooks/post-receive script.
uwabami-guest pushed a commit to branch master
in repository ruby-netcdf.
commit db4de3875f9f7bc6b966d3f7ce430406ca836781
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date: Thu Jul 30 19:31:49 2015 +0900
Refresh patches
Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
---
debian/changelog | 14 +-
...ay-Directory-for-Debian-s-Ruby-vendor-lib.patch | 23 -
...est-Path-for-running-under-test_runner.rb.patch | 24 -
...ctory-structure-suitable-for-Rubygems-Sty.patch | 11538 -------------------
debian/patches/0004-Fix-FTBFS-Hardening.patch | 2024 ----
debian/patches/series | 5 +-
6 files changed, 9 insertions(+), 13619 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 66c7533..ea86a40 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,12 +1,14 @@
-ruby-netcdf (0.6.6-3) UNRELEASED; urgency=medium
+ruby-netcdf (0.7.1.1-1) unstable; urgency=medium
- * Team upload.
+ [ Bas Couwenberg ]
* Add gbp.conf to use pristine-tar by default.
- * Restructure control file with cme, changes:
- - Bump Standards-Version to 3.9.6, no changes
- - Update Vcs-Browser URL to use cgit instead of gitweb
+ * Restructure control file with cme.
- -- Bas Couwenberg <sebastic at debian.org> Wed, 29 Jul 2015 14:02:02 +0200
+ [ Youhei SASAKI ]
+ * Update debian/watch: use gemwatch
+ * Imported Upstream version 0.7.1.1
+
+ -- Youhei SASAKI <uwabami at gfd-dennou.org> Thu, 30 Jul 2015 19:23:10 +0900
ruby-netcdf (0.6.6-2) unstable; urgency=medium
diff --git a/debian/patches/0001-Change-NArray-Directory-for-Debian-s-Ruby-vendor-lib.patch b/debian/patches/0001-Change-NArray-Directory-for-Debian-s-Ruby-vendor-lib.patch
deleted file mode 100644
index 125fbb4..0000000
--- a/debian/patches/0001-Change-NArray-Directory-for-Debian-s-Ruby-vendor-lib.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
-Date: Wed, 22 Feb 2012 17:49:07 +0900
-Subject: Change NArray Directory for Debian's Ruby vendor library location
-
-Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
----
- extconf.rb | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/extconf.rb b/extconf.rb
-index da90b7c..5e53471 100644
---- a/extconf.rb
-+++ b/extconf.rb
-@@ -1,7 +1,7 @@
- require "mkmf"
-
--dir_config('narray',$sitearchdir,$sitearchdir)
--dir_config('netcdf','/usr/local')
-+dir_config('narray',$vendorarchdir,$vendorarchdir)
-+dir_config('netcdf','/usr/')
-
- if ( ! ( have_header("narray.h") && have_header("narray_config.h") ) ) then
- print <<EOS
diff --git a/debian/patches/0002-Change-Test-Path-for-running-under-test_runner.rb.patch b/debian/patches/0002-Change-Test-Path-for-running-under-test_runner.rb.patch
deleted file mode 100644
index 510af96..0000000
--- a/debian/patches/0002-Change-Test-Path-for-running-under-test_runner.rb.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Debian GIS Project <pkg-grass-devel at lists.alioth.debian.org>
-Date: Wed, 22 Feb 2012 17:49:07 +0900
-Subject: Change Test Path for running under test_runner.rb
-
-Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
----
- test/test.rb | 6 +-----
- 1 file changed, 1 insertion(+), 5 deletions(-)
-
-diff --git a/test/test.rb b/test/test.rb
-index 7ec59c6..d9714c3 100644
---- a/test/test.rb
-+++ b/test/test.rb
-@@ -1,9 +1,5 @@
--##require 'numru/netcdf'
--## // to test before make install -->
- require 'narray'
--require '../netcdfraw'
--require '../lib/netcdf'
--## <-- to test before make install //
-+require 'numru/netcdf'
-
- include NumRu
-
diff --git a/debian/patches/0003-Update-directory-structure-suitable-for-Rubygems-Sty.patch b/debian/patches/0003-Update-directory-structure-suitable-for-Rubygems-Sty.patch
deleted file mode 100644
index 40ca2a4..0000000
--- a/debian/patches/0003-Update-directory-structure-suitable-for-Rubygems-Sty.patch
+++ /dev/null
@@ -1,11538 +0,0 @@
-From: Youhei SASAKI <uwabami at gfd-dennou.org>
-Date: Tue, 6 Mar 2012 18:30:47 +0900
-Subject: Update directory structure: suitable for Rubygems Style
-
-Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
----
- ext/numru/extconf.rb | 124 ++
- ext/numru/netcdfraw.c | 4614 ++++++++++++++++++++++++++++++++++++++++++++++
- extconf.rb | 124 --
- lib/netcdf.rb | 792 --------
- lib/netcdf_miss.rb | 203 --
- lib/numru/netcdf.rb | 792 ++++++++
- lib/numru/netcdf_miss.rb | 203 ++
- netcdfraw.c | 4614 ----------------------------------------------
- 8 files changed, 5733 insertions(+), 5733 deletions(-)
- create mode 100644 ext/numru/extconf.rb
- create mode 100644 ext/numru/netcdfraw.c
- delete mode 100644 extconf.rb
- delete mode 100644 lib/netcdf.rb
- delete mode 100644 lib/netcdf_miss.rb
- create mode 100644 lib/numru/netcdf.rb
- create mode 100644 lib/numru/netcdf_miss.rb
- delete mode 100644 netcdfraw.c
-
-diff --git a/ext/numru/extconf.rb b/ext/numru/extconf.rb
-new file mode 100644
-index 0000000..5e53471
---- /dev/null
-+++ b/ext/numru/extconf.rb
-@@ -0,0 +1,124 @@
-+require "mkmf"
-+
-+dir_config('narray',$vendorarchdir,$vendorarchdir)
-+dir_config('netcdf','/usr/')
-+
-+if ( ! ( have_header("narray.h") && have_header("narray_config.h") ) ) then
-+print <<EOS
-+** configure error **
-+ Header narray.h or narray_config.h is not found. If you have these files in
-+ /narraydir/include, try the following:
-+
-+ % ruby extconf.rb --with-narray-include=/narraydir/include
-+
-+EOS
-+ exit(-1)
-+end
-+
-+if xsystem("ncdap-config --libs")
-+ libncdods = "nc-dap"
-+ cflags = `ncdap-config --cflags`.gsub(/\n/, " ")
-+ libs = `ncdap-config --libs`.gsub(/\n/, " ")
-+ prefix_dods = `ncdap-config --prefix`.gsub(/\n/, "")
-+elsif xsystem("opendap-config --libs")
-+ libncdods = "nc-dods"
-+ cflags = `opendap-config --cflags`.gsub(/\n/, " ")
-+ libs = `opendap-config --libs-nc`.gsub(/\n/, " ")
-+ prefix_dods = `opendap-config --prefix`.gsub(/\n/, "")
-+end
-+
-+if (enable_config('opendap',true) && ( xsystem("opendap-config --libs") ||
-+ xsystem("ncdap-config --libs") ) )
-+
-+ dir_config(libncdods,prefix_dods)
-+
-+ if (!have_library(libncdods))
-+ print <<-EOS
-+ ** ERROR ** Library not found: nc-dods (OPeNDAP/DODS-enabled NetCDF lib)
-+ Install it, or run extconf.rb with option --disable-opendap.
-+ ^^^^^^^^^^^^^^^^^
-+ EOS
-+ exit(-1)
-+ else
-+ print <<-EOS
-+ ** Message ** Compiling with OPeNDAP/DODS-enabled NetCDF library.
-+
-+ This is because the command opendap-config is found in your system.
-+ If you want to use the ordinary (non-DODS) version of NetCDF,
-+ run extconf.rb with option --disable-opendap.
-+ ^^^^^^^^^^^^^^^^^
-+ EOS
-+ end
-+
-+ $CFLAGS += ' '+cflags
-+ $LOCAL_LIBS += ' ' + libs
-+
-+ # non portable treatments: should be improved (by Horinouchi)
-+ CONFIG['LDSHARED'].sub!(/gcc/,'g++')
-+ $LIBS.sub!(/-lc\s/,'') ; $LIBS.sub!(/-lc$/,'')
-+ print <<-EOS
-+ ** Warning ** non-portable treatments are made,
-+ which was sucessfull redhat linux 9:
-+ * gcc was replaced with g++ in CONFIG['LDSHARED']
-+ * -lc library was removed if in $LIBS
-+
-+ EOS
-+ # p '@@@'
-+ # ary = []
-+ # CONFIG.each{|k,v| ary.push([k,v])}
-+ # ary.sort.each{|x| p x}
-+else
-+ if xsystem("nc-config --libs") # for NetCDF 4
-+ cflags = `nc-config --cflags`.gsub(/\n/, " ")
-+ libs = `nc-config --libs`.gsub(/\n/, " ")
-+ prefix_nc = `nc-config --prefix`.gsub(/\n/, "")
-+
-+ dir_config("netcdf",prefix_nc)
-+ $CFLAGS += ' ' + cflags
-+ $LOCAL_LIBS += ' ' + libs
-+ end
-+ if ( ! ( have_header("netcdf.h") && have_library("netcdf") ) )then
-+ print <<-EOS
-+ ** configure error **
-+ Header netcdf.h or the compiled netcdf library is not found.
-+ If you have the library installed under /netcdfdir (that is, netcdf.h is
-+ in /netcdfdir/include and the library in /netcdfdir/lib/),
-+ try the following:
-+
-+ % ruby extconf.rb --with-netcdf-dir=/netcdfdir
-+
-+ Alternatively, you can specify the two directory separately
-+ with --with-netcdf-include and --with-netcdf-lib.
-+ EOS
-+ exit(-1)
-+ end
-+end
-+
-+if /cygwin|mingw/ =~ RUBY_PLATFORM
-+ have_library("narray") || raise("ERROR: narray library is not found")
-+end
-+
-+create_makefile "numru/netcdfraw"
-+
-+###### Modify Makefile: #######
-+File.rename("Makefile","Makefile.orig")
-+oldmkfl = File.open("Makefile.orig")
-+newmkfl = File.open("Makefile","w")
-+oldmkfl.each_line{ |line|
-+ case(line)
-+ when /^distclean:/
-+ newmkfl.puts(line)
-+ newmkfl.puts("\t\t@$(RM) *.nc demo/*.nc demo/*~ lib/*~ doc/*~ test/*.nc test/*~ Makefile.orig")
-+ when /^all:/
-+ newmkfl.puts(line)
-+ newmkfl.puts("")
-+ newmkfl.puts("test: all") # insert the "test" target
-+ newmkfl.puts("\t\t at cd test && ruby test.rb && echo 'test did not fail :-p (please ignore the warnings)' && cd ..")
-+ when /lib\/netcdf/
-+ line = line.chomp! + "/"
-+ newmkfl.puts(line)
-+ else
-+ newmkfl.puts(line)
-+ end
-+}
-+newmkfl.close
-diff --git a/ext/numru/netcdfraw.c b/ext/numru/netcdfraw.c
-new file mode 100644
-index 0000000..9922d19
---- /dev/null
-+++ b/ext/numru/netcdfraw.c
-@@ -0,0 +1,4614 @@
-+#include<stdio.h>
-+#include "ruby.h"
-+#include "narray.h"
-+#include<netcdf.h>
-+#include<string.h>
-+
-+/* for compatibility with ruby 1.6 */
-+#ifndef RSTRING_PTR
-+#define RSTRING_PTR(s) (RSTRING(s)->ptr)
-+#endif
-+#ifndef RSTRING_LEN
-+#define RSTRING_LEN(s) (RSTRING(s)->len)
-+#endif
-+#ifndef RARRAY_PTR
-+#define RARRAY_PTR(a) (RARRAY(a)->ptr)
-+#endif
-+#ifndef RARRAY_LEN
-+#define RARRAY_LEN(a) (RARRAY(a)->len)
-+#endif
-+#ifndef StringValueCStr
-+#define StringValueCStr(s) STR2CSTR(s)
-+#endif
-+#ifndef SafeStringValue
-+#define SafeStringValue(s) Check_SafeStr(s)
-+#endif
-+
-+/* Data to NArray */
-+
-+/* memcpy(ary->ptr,nc_ptr,na_sizeof[NA_SINT]*ary->total); \ */
-+
-+#define Cbyte_to_NArray(v, rank, shape, up) \
-+{ \
-+ struct NARRAY *ary; \
-+ v = na_make_object(NA_BYTE, rank, shape, cNArray); \
-+ GetNArray(v,ary); \
-+ up = (unsigned char *)ary->ptr; \
-+}
-+
-+#define Csint_to_NArray(v, rank, shape, sp) \
-+{ \
-+ struct NARRAY *ary; \
-+ v = na_make_object(NA_SINT, rank, shape, cNArray); \
-+ GetNArray(v, ary); \
-+ sp = (short *)ary->ptr; \
-+}
-+
-+#define Clint_to_NArray(v, rank, shape, lp) \
-+{ \
-+ struct NARRAY *ary; \
-+ v = na_make_object(NA_LINT, rank, shape, cNArray); \
-+ GetNArray(v, ary); \
-+ lp = (int *)ary->ptr; \
-+}
-+#define Cfloat_to_NArray(v, rank, shape, fp) \
-+{ \
-+ struct NARRAY *ary; \
-+ v = na_make_object(NA_SFLOAT, rank, shape, cNArray); \
-+ GetNArray(v, ary); \
-+ fp = (float *)ary->ptr; \
-+}
-+#define Cdouble_to_NArray(v, rank, shape, dp); \
-+{ \
-+ struct NARRAY *ary; \
-+ v = na_make_object(NA_DFLOAT, rank, shape, cNArray); \
-+ GetNArray(v, ary); \
-+ dp = (double *)ary->ptr; \
-+}
-+
-+/* Array or NArray to pointer and length (with no new allocation) */
-+
-+#define Array_to_Cfloat_len(obj, ptr, len) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (float *) NA_PTR(na,0); \
-+ len = na->total; \
-+}
-+
-+#define Array_to_Cfloat_len_shape(obj, ptr, len, shape) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (float *) NA_PTR(na,0); \
-+ len = na->total; \
-+ shape = na->shape; \
-+}
-+
-+#define Array_to_Cdouble_len(obj, ptr, len) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_DFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (double *) NA_PTR(na,0); \
-+ len = na->total; \
-+}
-+#define Array_to_Cdouble_len_shape(obj, ptr, len, shape) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_DFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (double *) NA_PTR(na,0); \
-+ len = na->total; \
-+ shape = na->shape; \
-+}
-+
-+#define Array_to_Cbyte_len(obj, ptr, len) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_BYTE); \
-+ GetNArray(obj, na); \
-+ ptr = (u_int8_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+}
-+
-+#define Array_to_Cbyte_len_shape(obj, ptr, len, shape) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_BYTE); \
-+ GetNArray(obj, na); \
-+ ptr = (u_int8_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+ shape = na->shape; \
-+}
-+
-+#define Array_to_Csint_len(obj, ptr, len) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int16_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+}
-+
-+#define Array_to_Csint_len_shape(obj, ptr, len, shape) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int16_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+ shape = na->shape; \
-+}
-+
-+
-+#define Array_to_Clint_len(obj, ptr, len) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_LINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int32_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+}
-+
-+#define Array_to_Clint_len_shape(obj, ptr, len, shape) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_LINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int32_t *) NA_PTR(na,0); \
-+ len = na->total; \
-+ shape = na->shape; \
-+}
-+
-+
-+/* Array or NArray to pointer (with no new allocation) */
-+
-+#define Array_to_Cfloat(obj, ptr) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (float *) NA_PTR(na,0); \
-+}
-+#define Array_to_Cdouble(obj, ptr) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_DFLOAT); \
-+ GetNArray(obj, na); \
-+ ptr = (double *) NA_PTR(na,0); \
-+}
-+#define Array_to_Cbyte(obj, ptr) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_BYTE); \
-+ GetNArray(obj, na); \
-+ ptr = (u_int8_t *) NA_PTR(na,0); \
-+}
-+#define Array_to_Csint(obj, ptr) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_SINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int16_t *) NA_PTR(na,0); \
-+}
-+#define Array_to_Clint(obj, ptr) \
-+{ \
-+ struct NARRAY *na; \
-+ obj = na_cast_object(obj, NA_LINT); \
-+ GetNArray(obj, na); \
-+ ptr = (int32_t *) NA_PTR(na,0); \
-+}
-+
-+#define NC_RAISE(status) rb_raise(err_status2class(status),(nc_strerror(status)))
-+#define NC_RAISE2(status, str) rb_raise(err_status2class(status),"%s (%s)",nc_strerror(status),(str) )
-+
-+static VALUE mNumRu = 0;
-+static VALUE cNetCDF;
-+static VALUE cNetCDFDim;
-+static VALUE cNetCDFAtt;
-+static VALUE cNetCDFVar;
-+
-+static VALUE rb_eNetcdfError;
-+static VALUE rb_eNetcdfBadid;
-+static VALUE rb_eNetcdfNfile;
-+static VALUE rb_eNetcdfExist;
-+static VALUE rb_eNetcdfInval;
-+static VALUE rb_eNetcdfPerm;
-+static VALUE rb_eNetcdfNotindefine;
-+static VALUE rb_eNetcdfIndefine;
-+static VALUE rb_eNetcdfInvalcoords;
-+static VALUE rb_eNetcdfMaxdims;
-+static VALUE rb_eNetcdfNameinuse;
-+static VALUE rb_eNetcdfNotatt;
-+static VALUE rb_eNetcdfMaxatts;
-+static VALUE rb_eNetcdfBadtype;
-+static VALUE rb_eNetcdfBaddim;
-+static VALUE rb_eNetcdfUnlimpos;
-+static VALUE rb_eNetcdfMaxvars;
-+static VALUE rb_eNetcdfNotvar;
-+static VALUE rb_eNetcdfGlobal;
-+static VALUE rb_eNetcdfNotnc;
-+static VALUE rb_eNetcdfSts;
-+static VALUE rb_eNetcdfMaxname;
-+static VALUE rb_eNetcdfUnlimit;
-+static VALUE rb_eNetcdfNorecvars;
-+static VALUE rb_eNetcdfChar;
-+static VALUE rb_eNetcdfEdge;
-+static VALUE rb_eNetcdfStride;
-+static VALUE rb_eNetcdfBadname;
-+static VALUE rb_eNetcdfRange;
-+static VALUE rb_eNetcdfNomem;
-+
-+/* Special Error */
-+/* Global error status */
-+
-+static VALUE rb_eNetcdfFatal;
-+
-+/* Global options variable. Used to determine behavior of error handler. */
-+
-+static VALUE rb_eNetcdfEntool;
-+static VALUE rb_eNetcdfExdr;
-+static VALUE rb_eNetcdfSyserr;
-+
-+
-+struct Netcdf{
-+ int ncid;
-+ char *name;
-+ int closed;
-+};
-+
-+struct NetCDFDim{
-+ int dimid;
-+ int ncid;
-+};
-+
-+struct NetCDFVar{
-+ int varid;
-+ int ncid;
-+ VALUE file;
-+};
-+
-+struct NetCDFAtt{
-+ int varid;
-+ int ncid;
-+ char *name;
-+};
-+
-+static struct Netcdf *
-+NetCDF_init(int ncid,char *filename)
-+{
-+ struct Netcdf *Netcdffile;
-+ Netcdffile=xmalloc(sizeof(struct Netcdf));
-+ Netcdffile->ncid=ncid;
-+ Netcdffile->closed=0;
-+ Netcdffile->name=xmalloc((strlen(filename)+1)*sizeof(char));
-+ strcpy(Netcdffile->name,filename);
-+ return(Netcdffile);
-+}
-+
-+static struct NetCDFDim *
-+NetCDF_dim_init(int ncid,int dimid)
-+{
-+ struct NetCDFDim *Netcdf_dim;
-+ Netcdf_dim=xmalloc(sizeof(struct NetCDFDim));
-+ Netcdf_dim->dimid=dimid;
-+ Netcdf_dim->ncid=ncid;
-+ return(Netcdf_dim);
-+}
-+
-+static struct NetCDFVar *
-+NetCDF_var_init(int ncid,int varid,VALUE file)
-+{
-+ struct NetCDFVar *Netcdf_var;
-+ Netcdf_var=xmalloc(sizeof(struct NetCDFVar));
-+ Netcdf_var->varid=varid;
-+ Netcdf_var->ncid=ncid;
-+ Netcdf_var->file=file;
-+ return(Netcdf_var);
-+}
-+static struct NetCDFAtt *
-+NetCDF_att_init(int ncid,int varid,char *attname)
-+{
-+ struct NetCDFAtt *Netcdf_att;
-+ Netcdf_att=xmalloc(sizeof(struct NetCDFAtt));
-+ Netcdf_att->ncid=ncid;
-+ Netcdf_att->varid=varid;
-+ Netcdf_att->name=xmalloc((strlen(attname)+1)*sizeof(char));
-+ strcpy(Netcdf_att->name,attname);
-+ return(Netcdf_att);
-+}
-+
-+void
-+Netcdf_att_free(struct NetCDFAtt *Netcdf_att)
-+{
-+ free(Netcdf_att->name);
-+ free(Netcdf_att);
-+}
-+
-+void
-+NetCDF_var_free(struct NetCDFVar *Netcdf_var)
-+{
-+ free(Netcdf_var);
-+}
-+
-+void
-+NetCDF_dim_free(struct NetCDFDim *Netcdf_dim)
-+{
-+ free(Netcdf_dim);
-+}
-+
-+void
-+NetCDF_free(struct Netcdf *Netcdffile)
-+{
-+ int status;
-+ if (!Netcdffile->closed){
-+ status = nc_close(Netcdffile->ncid); /* no error check -- not to stop during GC */
-+ }
-+ free(Netcdffile->name);
-+ free(Netcdffile);
-+}
-+
-+static VALUE
-+err_status2class(int status)
-+{
-+ if(NC_ISSYSERR(status)){
-+ return(rb_eNetcdfSyserr);
-+ }
-+ switch(status)
-+ {
-+ case(NC_EBADID):
-+ return(rb_eNetcdfBadid);break;
-+ case(NC_ENFILE):
-+ return(rb_eNetcdfNfile);break;
-+ case(NC_EEXIST):
-+ return(rb_eNetcdfExist);break;
-+ case(NC_EINVAL):
-+ return(rb_eNetcdfInval);break;
-+ case(NC_EPERM):
-+ return(rb_eNetcdfPerm);break;
-+ case(NC_ENOTINDEFINE):
-+ return(rb_eNetcdfNotindefine);break;
-+ case(NC_EINDEFINE):
-+ return(rb_eNetcdfIndefine);break;
-+ case(NC_EINVALCOORDS):
-+ return(rb_eNetcdfInvalcoords);break;
-+ case(NC_EMAXDIMS):
-+ return(rb_eNetcdfMaxdims);break;
-+ case(NC_ENAMEINUSE):
-+ return(rb_eNetcdfNameinuse);break;
-+ case(NC_ENOTATT):
-+ return(rb_eNetcdfNotatt);break;
-+ case(NC_EMAXATTS):
-+ return(rb_eNetcdfMaxatts);break;
-+ case(NC_EBADTYPE):
-+ return(rb_eNetcdfBadtype);break;
-+ case(NC_EBADDIM):
-+ return(rb_eNetcdfBaddim);break;
-+ case(NC_EUNLIMPOS):
-+ return(rb_eNetcdfUnlimpos);break;
-+ case(NC_EMAXVARS):
-+ return(rb_eNetcdfMaxvars);break;
-+ case(NC_ENOTVAR):
-+ return(rb_eNetcdfNotvar);break;
-+ case(NC_EGLOBAL):
-+ return(rb_eNetcdfGlobal);break;
-+ case(NC_ENOTNC):
-+ return(rb_eNetcdfNotnc);break;
-+ case(NC_ESTS):
-+ return(rb_eNetcdfSts);break;
-+ case(NC_EMAXNAME):
-+ return(rb_eNetcdfMaxname);break;
-+ case(NC_EUNLIMIT):
-+ return(rb_eNetcdfUnlimit);break;
-+ case(NC_ENORECVARS):
-+ return(rb_eNetcdfNorecvars);break;
-+ case(NC_ECHAR):
-+ return(rb_eNetcdfChar);break;
-+ case(NC_EEDGE):
-+ return(rb_eNetcdfEdge);break;
-+ case(NC_ESTRIDE):
-+ return(rb_eNetcdfStride);break;
-+ case(NC_EBADNAME):
-+ return(rb_eNetcdfBadname);break;
-+ case(NC_ERANGE):
-+ return(rb_eNetcdfRange);break;
-+ case(NC_ENOMEM):
-+ return(rb_eNetcdfNomem);break;
-+ /* case(NC_ENTOOL):
-+ return(rb_eNetcdfEntool);break; */
-+ case(NC_EXDR):
-+ return(rb_eNetcdfExdr);break;
-+ case(NC_SYSERR):
-+ return(rb_eNetcdfSyserr);break;
-+ case(NC_FATAL):
-+ return(rb_eNetcdfFatal);break;
-+ }
-+}
-+
-+static const char*
-+nctype2natype(int nctype){
-+ switch(nctype){
-+ case NC_CHAR:
-+ return("char");
-+ case NC_BYTE:
-+ return("byte");
-+ case NC_SHORT:
-+ return("sint");
-+ case NC_INT:
-+ return("int");
-+ case NC_FLOAT:
-+ return("sfloat");
-+ case NC_DOUBLE:
-+ return("float");
-+ default:
-+ rb_raise(rb_eNetcdfError, "No such netcdf type number %d\n",nctype);
-+ }
-+}
-+
-+static int
-+nctype2natypecode(int nctype){
-+ switch(nctype){
-+ case NC_CHAR:
-+ return(NA_BYTE);
-+ case NC_BYTE:
-+ return(NA_BYTE);
-+ case NC_SHORT:
-+ return(NA_SINT);
-+ case NC_INT:
-+ return(NA_LINT);
-+ case NC_FLOAT:
-+ return(NA_SFLOAT);
-+ case NC_DOUBLE:
-+ return(NA_DFLOAT);
-+ default:
-+ rb_raise(rb_eNetcdfError, "No such netcdf type number %d\n",nctype);
-+ }
-+}
-+
-+static int
-+natype2nctype(char *natype)
-+{
-+ if(strcmp(natype,"byte")==0) return(NC_BYTE);
-+ else if(strcmp(natype,"char")==0) return(NC_CHAR);
-+ else if(strcmp(natype,"text")==0) return(NC_CHAR); /* alias of char */
-+ else if(strcmp(natype,"string")==0) return(NC_CHAR); /* alias of char */
-+ else if(strcmp(natype,"sint")==0) return(NC_SHORT);
-+ else if(strcmp(natype,"int")==0) return(NC_INT);
-+ else if(strcmp(natype,"sfloat")==0) return(NC_FLOAT);
-+ else if(strcmp(natype,"float")==0) return(NC_DOUBLE);
-+ else rb_raise(rb_eNetcdfError, "No such NArray type '%s'",natype);
-+}
-+
-+static int
-+natypecode2nctype(int natypecode)
-+{
-+ if(natypecode==NA_BYTE) return(NC_BYTE);
-+ else if(natypecode==NA_SINT) return(NC_SHORT);
-+ else if(natypecode==NA_LINT) return(NC_INT);
-+ else if(natypecode==NA_SFLOAT) return(NC_FLOAT);
-+ else if(natypecode==NA_DFLOAT) return(NC_DOUBLE);
-+ else rb_raise(rb_eNetcdfError, "No such NArray typecode '%d'",natypecode);
-+}
-+
-+static void
-+nc_mark_obj(struct NetCDFVar *netcdf_var)
-+{
-+ VALUE ptr;
-+
-+ ptr = netcdf_var->file;
-+ rb_gc_mark(ptr);
-+}
-+
-+
-+VALUE
-+NetCDF_clone(VALUE file)
-+{
-+ VALUE clone;
-+ struct Netcdf *nc1, *nc2;
-+
-+ Data_Get_Struct(file, struct Netcdf, nc1);
-+ nc2 = NetCDF_init(nc1->ncid, nc1->name);
-+ clone = Data_Wrap_Struct(cNetCDF, 0, NetCDF_free, nc2);
-+ CLONESETUP(clone, file);
-+ return clone;
-+}
-+
-+VALUE
-+NetCDF_dim_clone(VALUE dim)
-+{
-+ VALUE clone;
-+ struct NetCDFDim *nd1, *nd2;
-+
-+ Data_Get_Struct(dim, struct NetCDFDim, nd1);
-+ nd2 = NetCDF_dim_init(nd1->ncid, nd1->dimid);
-+ clone = Data_Wrap_Struct(cNetCDFDim, 0, NetCDF_dim_free, nd2);
-+ CLONESETUP(clone, dim);
-+ return clone;
-+}
-+
-+VALUE
-+NetCDF_att_clone(VALUE att)
-+{
-+ VALUE clone;
-+ struct NetCDFAtt *na1, *na2;
-+
-+ Data_Get_Struct(att, struct NetCDFAtt, na1);
-+ na2 = NetCDF_att_init(na1->ncid, na1->varid, na1->name);
-+ clone = Data_Wrap_Struct(cNetCDFAtt, 0, Netcdf_att_free, na2);
-+ CLONESETUP(clone, att);
-+ return clone;
-+}
-+
-+VALUE
-+NetCDF_var_clone(VALUE var)
-+{
-+ VALUE clone;
-+ struct NetCDFVar *nv1, *nv2;
-+
-+ Data_Get_Struct(var, struct NetCDFVar, nv1);
-+ nv2 = NetCDF_var_init(nv1->ncid, nv1->varid, nv1->file);
-+ clone = Data_Wrap_Struct(cNetCDFVar, nc_mark_obj, NetCDF_var_free, nv2);
-+ CLONESETUP(clone, var);
-+ return clone;
-+}
-+
-+VALUE
-+NetCDF_close(file)
-+ VALUE file;
-+{
-+ int status;
-+ int ncid;
-+ struct Netcdf *Netcdffile;
-+
-+ if (rb_safe_level() >= 4 && !OBJ_TAINTED(file)) {
-+ rb_raise(rb_eSecurityError, "Insecure: can't close");
-+ }
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ if(!Netcdffile->closed){
-+ status = nc_close(ncid);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ Netcdffile->closed = 1;
-+ } else {
-+ rb_warn("file %s is already closed", Netcdffile->name);
-+ }
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_def_dim(VALUE file,VALUE dim_name,VALUE length)
-+{
-+ char* c_dim_name;
-+ size_t c_length;
-+ int ncid;
-+ int dimidp;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dimension;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+
-+ Check_Type(dim_name,T_STRING);
-+ c_dim_name=RSTRING_PTR(dim_name);
-+ c_length=NUM2UINT(length);
-+ ncid=Netcdffile->ncid;
-+
-+ status = nc_def_dim(ncid,c_dim_name,c_length,&dimidp);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ Netcdf_dim = NetCDF_dim_init(ncid,dimidp);
-+
-+ Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-+ return Dimension;
-+}
-+
-+
-+static VALUE
-+NetCDF_put_att_char(int ncid, char *name,VALUE value,VALUE atttype, int varid)
-+{
-+ int status;
-+ struct NetCDFAtt *ncatt;
-+
-+ /* check atttype (not necessarily needed but it's better to do it) */
-+ if (TYPE(atttype) == T_STRING){
-+ if ( natype2nctype(RSTRING_PTR(atttype)) != NC_CHAR ) {
-+ rb_raise(rb_eNetcdfError,
-+ "attribute type must be 'char' (or nil) for a String value");
-+ }
-+ } else if (TYPE(atttype) != T_NIL) {
-+ rb_raise(rb_eNetcdfError,
-+ "type specfication must be by a string or nil");
-+ }
-+ /* put value */
-+ Check_Type(value,T_STRING);
-+ status = nc_put_att_text(ncid, varid, name,
-+ RSTRING_LEN(value), RSTRING_PTR(value));
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ ncatt = NetCDF_att_init(ncid,varid,name);
-+ return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,ncatt));
-+}
-+
-+static VALUE
-+NetCDF_put_att_numeric(int ncid, char *name,VALUE value,VALUE atttype, int varid)
-+{
-+ VALUE val;
-+ struct NARRAY *na_val;
-+ int na_typecode, status, len;
-+ char *ptr;
-+ struct NetCDFAtt *ncatt;
-+
-+ /* check atttype and cast to an appropriate NArray if needed */
-+
-+ if (TYPE(atttype) != T_NIL){
-+ na_typecode = na_get_typecode(atttype);
-+ GetNArray( na_cast_object(value, na_typecode), na_val );
-+ } else {
-+ if (TYPE(value)==T_ARRAY) {
-+ val = RARRAY_PTR(value)[0]; /* to check the 1st elemnt if Array */
-+ } else {
-+ val = value;
-+ }
-+ switch(TYPE(val)){
-+ case T_FIXNUM:
-+ case T_BIGNUM:
-+ na_typecode = NA_LINT;
-+ GetNArray( na_cast_object(value, na_typecode), na_val );
-+ break;
-+ case T_FLOAT:
-+ na_typecode = NA_DFLOAT;
-+ GetNArray( na_cast_object(value, na_typecode), na_val );
-+ break;
-+ case T_DATA:
-+ if ( IsNArray(value) ){
-+ GetNArray(value,na_val);
-+ na_typecode = na_val->type;
-+ } else {
-+ rb_raise(rb_eNetcdfError,"value has a wrong data type");
-+ }
-+ break;
-+ default:
-+ rb_raise(rb_eNetcdfError,
-+ "value (or its first element) has a wrong type");
-+ }
-+ }
-+
-+ /* put value */
-+
-+ len = na_val->total;
-+ ptr = na_val->ptr;
-+ switch(na_typecode){
-+ case NA_BYTE:
-+ status = nc_put_att_uchar(ncid,varid,name,NC_BYTE,len,(unsigned char *)ptr);
-+ break;
-+ case NA_SINT:
-+ status = nc_put_att_short(ncid,varid,name,NC_SHORT,len,(short *)ptr);
-+ break;
-+ case NA_LINT:
-+ status = nc_put_att_int(ncid,varid,name,NC_INT,len,(int *)ptr);
-+ break;
-+ case NA_SFLOAT:
-+ status = nc_put_att_float(ncid,varid,name,NC_FLOAT,len,(float *)ptr);
-+ break;
-+ case NA_DFLOAT:
-+ status = nc_put_att_double(ncid,varid,name,NC_DOUBLE,len,(double*)ptr);
-+ break;
-+ default:
-+ rb_raise(rb_eNetcdfError,
-+ "unsupported type. code = %d",na_typecode);
-+ }
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ ncatt = NetCDF_att_init(ncid,varid,name);
-+ return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,ncatt));
-+}
-+
-+static VALUE
-+NetCDF_put_att__(int ncid, char *name, VALUE value, VALUE atttype, int varid)
-+ /*
-+ * atttype: nil or a String ("string","int",etc). If nil,
-+ * the type of attribute is determined from the type of value
-+ */
-+{
-+ switch(TYPE(value)){
-+ case T_STRING:
-+ return(NetCDF_put_att_char(ncid, name, value, atttype, varid));
-+ default:
-+ return(NetCDF_put_att_numeric(ncid, name, value, atttype, varid));
-+ }
-+}
-+
-+VALUE
-+NetCDF_put_att(VALUE file,VALUE att_name,VALUE value,VALUE atttype)
-+ /*
-+ * atttype: nil or a String ("string","int",etc). If nil,
-+ * the type of attribute is determined from the type of value
-+ */
-+{
-+ struct Netcdf *ncfile;
-+ char *name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ Check_Type(att_name,T_STRING);
-+ name = RSTRING_PTR(att_name);
-+
-+ return( NetCDF_put_att__(ncfile->ncid, name, value, atttype, NC_GLOBAL) );
-+}
-+
-+VALUE
-+NetCDF_put_att_var(VALUE var,VALUE att_name,VALUE value,VALUE atttype)
-+ /*
-+ * atttype: nil or a String ("string","int",etc). If nil,
-+ * the type of attribute is determined from the type of value
-+ */
-+{
-+ struct NetCDFVar *ncvar;
-+ char *name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(var,struct NetCDFVar,ncvar);
-+ Check_Type(att_name,T_STRING);
-+ name = RSTRING_PTR(att_name);
-+
-+ return( NetCDF_put_att__(ncvar->ncid, name, value, atttype, ncvar->varid));
-+}
-+
-+
-+VALUE
-+NetCDF_def_var(VALUE file,VALUE var_name,VALUE vartype,VALUE dimensions)
-+{
-+ int ncid;
-+ char *c_var_name;
-+ static int xtype;
-+ long c_ndims;
-+ int varidp;
-+ int dimidp;
-+ int i=0;
-+ int status;
-+ char *c_dim_name;
-+ int c_dimids[NC_MAX_DIMS];
-+ struct Netcdf *Netcdffile;
-+ struct NetCDFVar *Netcdf_var;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Var;
-+
-+ rb_secure(4);
-+ Check_Type(var_name,T_STRING);
-+ Check_Type(dimensions,T_ARRAY);
-+
-+ c_var_name=RSTRING_PTR(var_name);
-+ c_ndims=RARRAY_LEN(dimensions);
-+
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+
-+ if (TYPE(vartype) == T_STRING){
-+ xtype = natype2nctype(RSTRING_PTR(vartype));
-+ } else if (TYPE(vartype) == T_FIXNUM){
-+ xtype = natypecode2nctype(NUM2INT(vartype));
-+ } else {
-+ rb_raise(rb_eNetcdfError,
-+ "type specfication must be by a string or nil");
-+ }
-+
-+ for(i=0;i<c_ndims;i++){
-+ switch(TYPE(RARRAY_PTR(dimensions)[c_ndims-1-i])){
-+ case T_STRING:
-+ Check_Type(RARRAY_PTR(dimensions)[c_ndims-1-i],T_STRING);
-+ c_dim_name=StringValueCStr(RARRAY_PTR(dimensions)[c_ndims-1-i]);
-+ status=nc_inq_dimid(ncid,c_dim_name,&dimidp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ c_dimids[i]=dimidp;
-+ break;
-+ case T_DATA:
-+ Data_Get_Struct(RARRAY_PTR(dimensions)[c_ndims-1-i],struct NetCDFDim,Netcdf_dim);
-+ c_dimids[i]=Netcdf_dim->dimid;
-+ break;
-+ default:
-+ rb_raise(rb_eNetcdfError, "No such object of the netCDF dimension class.");
-+ }
-+ }
-+
-+ status = nc_def_var(ncid,c_var_name,xtype,c_ndims,c_dimids,&varidp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Netcdf_var = NetCDF_var_init(ncid,varidp,file);
-+
-+ Var=Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-+ return Var;
-+}
-+
-+
-+VALUE
-+NetCDF_dim(VALUE file,VALUE dim_name)
-+{
-+ int ncid;
-+ char *c_dim_name;
-+ int dimidp;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dimension;
-+
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ Check_Type(dim_name,T_STRING);
-+ c_dim_name=RSTRING_PTR(dim_name);
-+
-+ status = nc_inq_dimid(ncid,c_dim_name,&dimidp);
-+ if(status !=NC_NOERR){
-+ if(status == NC_EBADDIM){
-+ return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
-+ } else{
-+ NC_RAISE(status);
-+ }
-+ }
-+
-+ Netcdf_dim=NetCDF_dim_init(ncid,dimidp);
-+
-+ Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-+ return Dimension;
-+}
-+
-+VALUE
-+NetCDF_var(VALUE file,VALUE var_name)
-+{
-+ int ncid;
-+ int status;
-+ int varidp;
-+ char *c_var_name;
-+ struct Netcdf *Netcdffile;
-+ struct NetCDFVar *Netcdf_var;
-+ VALUE Variable;
-+
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ Check_Type(var_name,T_STRING);
-+ c_var_name=RSTRING_PTR(var_name);
-+
-+ status=nc_inq_varid(ncid,c_var_name,&varidp);
-+ if(status != NC_NOERR){
-+ if(status == NC_ENOTVAR){
-+ return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
-+ } else{
-+ NC_RAISE(status);
-+ }
-+ }
-+
-+ Netcdf_var = NetCDF_var_init(ncid,varidp,file);
-+ Variable = Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-+ return Variable;
-+}
-+
-+VALUE
-+NetCDF_att(VALUE file,VALUE att_name)
-+{
-+ int ncid;
-+ int status;
-+ int attnump;
-+ char *c_att_name;
-+ struct Netcdf *Netcdffile;
-+ struct NetCDFAtt *Netcdf_att;
-+ VALUE Attribute;
-+
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ Check_Type(att_name,T_STRING);
-+ c_att_name=RSTRING_PTR(att_name);
-+
-+
-+ status = nc_inq_attid(ncid,NC_GLOBAL,c_att_name,&attnump);
-+ if(status != NC_NOERR){
-+ if(status == NC_ENOTATT){
-+ return(Qnil);
-+ }
-+ else{
-+ NC_RAISE(status);
-+ }
-+ }
-+
-+ Netcdf_att = NetCDF_att_init(ncid,NC_GLOBAL,c_att_name);
-+
-+ Attribute = Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-+
-+ return Attribute;
-+}
-+VALUE
-+NetCDF_fill(VALUE file,VALUE mode)
-+{
-+ int ncid;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+ int old_modep;
-+
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid = Netcdffile->ncid;
-+ if(mode==Qfalse){
-+ status = nc_set_fill(ncid,NC_NOFILL,&old_modep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ }
-+ else if(mode == Qtrue){
-+ status = nc_set_fill(ncid,NC_FILL,&old_modep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ }
-+ else
-+ rb_raise(rb_eNetcdfError,"Usage:self.fill(true) or self.fill(false)");
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_redef(VALUE file)
-+{
-+ int ncid;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ status = nc_redef(ncid);
-+ if(status !=NC_NOERR){
-+ if(status == NC_EINDEFINE){
-+ return Qnil;
-+ }
-+ else{
-+ NC_RAISE(status);
-+ }
-+ }
-+ return Qtrue;
-+}
-+
-+VALUE
-+NetCDF_enddef(VALUE file)
-+{
-+ int ncid;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ status = nc_enddef(ncid);
-+ if(status !=NC_NOERR){
-+ if(status == NC_ENOTINDEFINE){
-+ return Qnil;
-+ }
-+ else{
-+ NC_RAISE(status);
-+ }
-+ }
-+ return Qtrue;
-+}
-+
-+VALUE
-+NetCDF_whether_in_define_mode(VALUE file)
-+{
-+ /* returns true if the NetCDF object is currently in the define mode,
-+ false if in the data mode, and
-+ nil if else (possibly the file is read-only, or some other
-+ error occurred)
-+ */
-+ int ncid;
-+ int status;
-+ struct Netcdf *Netcdffile;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,Netcdffile);
-+ ncid=Netcdffile->ncid;
-+ status = nc_redef(ncid);
-+ if(status == NC_EINDEFINE){
-+ return Qtrue;
-+ } else if(status == NC_NOERR) {
-+ /* was in the data mode --> recover the data mode and report false */
-+ status = nc_enddef(ncid);
-+ if(status == NC_NOERR) {
-+ return Qfalse;
-+ } else {
-+ return Qnil;
-+ }
-+ } else {
-+ return Qnil;
-+ }
-+}
-+
-+VALUE
-+NetCDF_open(VALUE mod,VALUE filename,VALUE omode)
-+{
-+ int status;
-+ int ncid;
-+ char* c_filename;
-+ int c_omode;
-+ struct Netcdf *ncfile;
-+ VALUE retval;
-+
-+ Check_Type(filename,T_STRING);
-+ SafeStringValue(filename);
-+ c_filename=RSTRING_PTR(filename);
-+ Check_Type(omode,T_FIXNUM);
-+ c_omode=NUM2INT(omode);
-+
-+ status = nc_open(c_filename,c_omode,&ncid);
-+ if(status !=NC_NOERR){NC_RAISE2(status,c_filename);}
-+
-+ ncfile = NetCDF_init(ncid,c_filename);
-+ retval = Data_Wrap_Struct(cNetCDF,0,NetCDF_free,ncfile);
-+ return( retval );
-+}
-+
-+VALUE
-+NetCDF_create(VALUE mod,VALUE filename,VALUE cmode)
-+{
-+ int ncid;
-+ int status;
-+ char* c_filename;
-+ int c_cmode;
-+ struct Netcdf *ncfile;
-+
-+ Check_Type(filename,T_STRING);
-+ SafeStringValue(filename);
-+ c_filename=RSTRING_PTR(filename);
-+ Check_Type(cmode,T_FIXNUM);
-+ c_cmode=NUM2INT(cmode);
-+
-+ status = nc_create(c_filename,c_cmode,&ncid);
-+ if(status != NC_NOERR) NC_RAISE2(status, c_filename);
-+
-+ ncfile = NetCDF_init(ncid,c_filename);
-+ return( Data_Wrap_Struct(cNetCDF,0,NetCDF_free,ncfile) );
-+}
-+
-+VALUE
-+NetCDF_ndims(VALUE file)
-+{
-+ int ncid;
-+ int ndimsp;
-+ VALUE Integer;
-+ int status;
-+ struct Netcdf *ncfile;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ status = nc_inq_ndims(ncid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE (status);
-+ Integer = INT2NUM(ndimsp);
-+ return Integer;
-+}
-+
-+VALUE
-+NetCDF_nvars(VALUE file)
-+{
-+ int ncid;
-+ int nvarsp;
-+ int status;
-+ VALUE Integer;
-+ struct Netcdf *ncfile;
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ status = nc_inq_nvars(ncid,&nvarsp);
-+ if(status != NC_NOERR) NC_RAISE (status);
-+ Integer = INT2NUM(nvarsp);
-+ return Integer;
-+}
-+
-+VALUE
-+NetCDF_natts(VALUE file)
-+{
-+ int ncid;
-+ int nattsp;
-+ int status;
-+ VALUE Integer;
-+ struct Netcdf *ncfile;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ status=nc_inq_natts(ncid,&nattsp);
-+ if(status != NC_NOERR) NC_RAISE (status);
-+ Integer = INT2NUM(nattsp);
-+ return Integer;
-+}
-+
-+VALUE
-+NetCDF_unlimited(VALUE file)
-+{
-+ int ncid;
-+ int unlimdimidp;
-+ int status;
-+ struct Netcdf *ncfile;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dimension;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ status=nc_inq_unlimdim(ncid,&unlimdimidp);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ Netcdf_dim = NetCDF_dim_init(ncid,unlimdimidp);
-+
-+ /* If unlimdimidp=-1,No unlimited dimension is defined in the netCDF dataset */
-+ if(unlimdimidp != -1)
-+ {
-+ Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-+ return Dimension;
-+ }
-+ else
-+ {
-+ return Qnil;
-+ }
-+}
-+
-+VALUE
-+NetCDF_sync(VALUE file)
-+{
-+ int ncid;
-+ int status;
-+ struct Netcdf *ncfile;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ status = nc_sync(ncid);
-+ if(status !=NC_NOERR) NC_RAISE (status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_path(VALUE file)
-+{
-+ char *path;
-+ struct Netcdf *ncfile;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ path=ncfile->name;
-+ return(rb_str_new2(path));
-+}
-+
-+VALUE
-+NetCDF_dim_length(VALUE Dim)
-+{
-+ int ncid;
-+ int status;
-+ int dimid;
-+ size_t lengthp;
-+ struct NetCDFDim *Netcdf_dim;
-+
-+ Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-+ ncid=Netcdf_dim->ncid;
-+ dimid=Netcdf_dim->dimid;
-+
-+ status = nc_inq_dimlen(ncid,dimid,&lengthp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ return(INT2NUM(lengthp));
-+}
-+
-+VALUE
-+NetCDF_dim_name(VALUE Dim,VALUE dimension_newname)
-+{
-+ int ncid;
-+ int status;
-+ int dimid;
-+ char *c_dim_name;
-+ struct NetCDFDim *Netcdf_dim;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-+ ncid=Netcdf_dim->ncid;
-+ dimid=Netcdf_dim->dimid;
-+ Check_Type(dimension_newname,T_STRING);
-+ c_dim_name = StringValueCStr(dimension_newname);
-+
-+ status = nc_rename_dim(ncid,dimid,c_dim_name);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_dim_inqname(VALUE Dim)
-+{
-+ int ncid;
-+ int status;
-+ int dimid;
-+ char c_dim_name[NC_MAX_NAME];
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE str;
-+
-+ Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-+ ncid=Netcdf_dim->ncid;
-+ dimid=Netcdf_dim->dimid;
-+
-+ status = nc_inq_dimname(ncid,dimid,c_dim_name);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ str = rb_str_new2(c_dim_name);
-+ OBJ_TAINT(str);
-+ return(str);
-+}
-+
-+VALUE
-+NetCDF_dim_whether_unlimited(VALUE Dim)
-+{
-+ int status;
-+ int uldid;
-+ struct NetCDFDim *Netcdf_dim;
-+
-+ Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-+ status=nc_inq_unlimdim(Netcdf_dim->ncid,&uldid);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ if(Netcdf_dim->dimid == uldid){
-+ return(Qtrue);
-+ } else {
-+ return(Qfalse);
-+ }
-+}
-+
-+VALUE
-+NetCDF_att_inq_name(VALUE Att)
-+{
-+ char *c_att_name;
-+ struct NetCDFAtt *Netcdf_att;
-+ VALUE str;
-+
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ c_att_name=Netcdf_att->name;
-+
-+ str = rb_str_new2(c_att_name);
-+ OBJ_TAINT(str);
-+ return(str);
-+}
-+
-+VALUE
-+NetCDF_att_rename(VALUE Att,VALUE new_att_name)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ char *c_att_name;
-+ char *c_new_att_name;
-+ struct NetCDFAtt *Netcdf_att;
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ ncid=Netcdf_att->ncid;
-+ varid=Netcdf_att->varid;
-+
-+ c_att_name=Netcdf_att->name;
-+
-+ Check_Type(new_att_name,T_STRING);
-+ SafeStringValue(new_att_name);
-+ c_new_att_name=StringValueCStr(new_att_name);
-+
-+ status = nc_rename_att(ncid,varid,c_att_name,c_new_att_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ strcpy(Netcdf_att->name,c_new_att_name);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_id2dim(VALUE file,VALUE dimid)
-+{
-+ int ncid;
-+ int c_dimid;
-+ struct Netcdf *ncfile;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dim;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ Check_Type(dimid,T_FIXNUM);
-+ c_dimid=NUM2INT(dimid);
-+ Netcdf_dim = NetCDF_dim_init(ncid,c_dimid);
-+ Dim=Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-+ return(Dim);
-+}
-+
-+VALUE
-+NetCDF_id2var(VALUE file,VALUE varid)
-+{
-+ int ncid;
-+ int c_varid;
-+ struct Netcdf *ncfile;
-+ struct NetCDFVar *Netcdf_var;
-+ VALUE Var;
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+ Check_Type(varid,T_FIXNUM);
-+ c_varid=NUM2INT(varid);
-+ Netcdf_var = NetCDF_var_init(ncid,c_varid,file);
-+ Var=Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-+ return(Var);
-+}
-+
-+
-+VALUE
-+NetCDF_id2att(VALUE file,VALUE attnum)
-+{
-+ int ncid;
-+ int c_attnum;
-+ int status;
-+ struct Netcdf *ncfile;
-+ struct NetCDFAtt *Netcdf_att;
-+ char *c_att_name;
-+ VALUE Att;
-+ c_att_name=ALLOCA_N(char,NC_MAX_NAME);
-+
-+ Data_Get_Struct(file,struct Netcdf,ncfile);
-+ ncid=ncfile->ncid;
-+
-+ Check_Type(attnum,T_FIXNUM);
-+ c_attnum=NUM2INT(attnum);
-+
-+ status = nc_inq_attname(ncid,NC_GLOBAL,c_attnum,c_att_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Netcdf_att=NetCDF_att_init(ncid,NC_GLOBAL,c_att_name);
-+
-+ Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-+ return(Att);
-+
-+}
-+
-+VALUE
-+NetCDF_var_id2att(VALUE Var,VALUE attnum)
-+{
-+ int ncid;
-+ int c_attnum;
-+ int status;
-+ int c_varid;
-+ struct NetCDFVar *Netcdf_var;
-+ struct NetCDFAtt *Netcdf_att;
-+ char *c_att_name;
-+ VALUE Att;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ c_varid=Netcdf_var->varid;
-+
-+ Check_Type(attnum,T_FIXNUM);
-+ c_attnum=NUM2INT(attnum);
-+
-+ c_att_name=ALLOCA_N(char,NC_MAX_NAME);
-+
-+ status = nc_inq_attname(ncid,c_varid,c_attnum,c_att_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Netcdf_att=NetCDF_att_init(ncid,c_varid,c_att_name);
-+ Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-+ return(Att);
-+}
-+
-+VALUE
-+NetCDF_var_dims(VALUE Var)
-+{
-+ int ncid, *dimids, ndims, varid, i, status;
-+ struct NetCDFVar *Netcdf_var;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dims;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ Dims = rb_ary_new();
-+ for(i=0;i<ndims;i++){
-+ Netcdf_dim = NetCDF_dim_init(ncid,dimids[ndims-1-i]);
-+ rb_ary_push(Dims,
-+ Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim));
-+ }
-+ return(Dims);
-+}
-+
-+VALUE
-+NetCDF_var_dim(VALUE Var, VALUE ith)
-+{
-+ int ncid, *dimids, ndims, varid, status, c_ith;
-+ struct NetCDFVar *Netcdf_var;
-+ struct NetCDFDim *Netcdf_dim;
-+ VALUE Dim;
-+
-+ Check_Type(ith,T_FIXNUM);
-+ c_ith=NUM2INT(ith);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(c_ith < 0 || c_ith >= ndims) {
-+ rb_raise(rb_eNetcdfError, "dimension count less than zero or greater than ndims-1");
-+ }
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ Netcdf_dim = NetCDF_dim_init(ncid,dimids[ndims-1-c_ith]);
-+ Dim = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-+ return(Dim);
-+}
-+
-+VALUE
-+NetCDF_att_copy(VALUE Att,VALUE Var_or_File)
-+{
-+ int ncid_in,ncid_out;
-+ int status;
-+ int varid_in,varid_out;
-+ char *att_name;
-+ struct NetCDFAtt *Netcdf_att;
-+ struct NetCDFVar *Netcdf_var;
-+ struct Netcdf *ncfile;
-+ struct NetCDFAtt *Netcdf_att_out;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ ncid_in=Netcdf_att->ncid;
-+ varid_in=Netcdf_att->varid;
-+ att_name=Netcdf_att->name;
-+
-+ if( rb_obj_is_kind_of(Var_or_File, cNetCDFVar) ){
-+ Data_Get_Struct(Var_or_File,struct NetCDFVar, Netcdf_var);
-+ ncid_out=Netcdf_var->ncid;
-+ varid_out=Netcdf_var->varid;
-+ } else if ( rb_obj_is_kind_of(Var_or_File, cNetCDF) ){
-+ Data_Get_Struct(Var_or_File,struct Netcdf, ncfile);
-+ ncid_out=ncfile->ncid;
-+ varid_out=NC_GLOBAL;
-+ } else {
-+ rb_raise(rb_eNetcdfError,"The argument must be a NetCDFVar or a NetCDF");
-+ }
-+
-+ status = nc_copy_att(ncid_in,varid_in,att_name,ncid_out,varid_out);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ Netcdf_att_out = NetCDF_att_init(ncid_out,varid_out,att_name);
-+ return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att_out));
-+}
-+
-+VALUE
-+NetCDF_att_atttype(VALUE Att)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ char *att_name;
-+ const char *Attname;
-+ struct NetCDFAtt *Netcdf_att;
-+ nc_type xtypep;
-+
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ ncid = Netcdf_att->ncid;
-+ varid = Netcdf_att->varid;
-+ att_name = Netcdf_att->name;
-+
-+ status = nc_inq_atttype(ncid,varid,att_name,&xtypep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Attname = nctype2natype(xtypep);
-+ return(rb_str_new2(Attname));
-+}
-+
-+VALUE
-+NetCDF_att_typecode(VALUE Att)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ char *att_name;
-+ struct NetCDFAtt *Netcdf_att;
-+ nc_type xtypep;
-+
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ ncid = Netcdf_att->ncid;
-+ varid = Netcdf_att->varid;
-+ att_name = Netcdf_att->name;
-+
-+ status = nc_inq_atttype(ncid,varid,att_name,&xtypep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ return(INT2NUM(nctype2natypecode(xtypep)));
-+}
-+
-+VALUE
-+NetCDF_att_delete(VALUE Att)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ char *c_att_name;
-+ struct NetCDFAtt *Netcdf_att;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+
-+ ncid=Netcdf_att->ncid;
-+ varid=Netcdf_att->varid;
-+ c_att_name=Netcdf_att->name;
-+
-+ status = nc_del_att(ncid,varid,c_att_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_att_put(VALUE Att,VALUE value,VALUE atttype)
-+ /*
-+ * atttype: nil or a String ("string","int",etc). If nil,
-+ * the type of attribute is determined from the type of value
-+ */
-+{
-+ struct NetCDFAtt *ncatt;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Att,struct NetCDFAtt,ncatt);
-+ return( NetCDF_put_att__(ncatt->ncid, ncatt->name, value,
-+ atttype, ncatt->varid) );
-+}
-+
-+VALUE
-+NetCDF_att_get(VALUE Att)
-+{
-+ int ncid;
-+ int varid;
-+ char *c_attname;
-+ int status;
-+ struct NetCDFAtt *Netcdf_att;
-+ nc_type xtypep;
-+ size_t lenp;
-+ int attlen[1]; /* NArray uses int instead of size_t */
-+ char *tp;
-+ unsigned char *up;
-+ short *sp;
-+ int *ip;
-+ float *fp;
-+ double *dp;
-+ VALUE NArray;
-+ VALUE str;
-+
-+ Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-+ ncid = Netcdf_att->ncid;
-+ varid = Netcdf_att->varid;
-+ c_attname = Netcdf_att->name;
-+
-+ status = nc_inq_atttype(ncid,varid,c_attname,&xtypep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ switch(xtypep){
-+ case NC_CHAR:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ tp = ALLOCA_N(char,lenp+1);
-+ tp[lenp]= '\0';
-+ status = nc_get_att_text(ncid,varid,c_attname,tp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ str = rb_str_new2(tp);
-+ OBJ_TAINT(str);
-+ return(str);
-+ break;
-+ case NC_BYTE:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ attlen[0]=lenp;
-+ Cbyte_to_NArray(NArray,1,attlen,up);
-+
-+ status = nc_get_att_uchar(ncid,varid,c_attname,up);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+ break;
-+ case NC_SHORT:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ attlen[0]=lenp;
-+ Csint_to_NArray(NArray,1,attlen,sp);
-+
-+ status = nc_get_att_short(ncid,varid,c_attname,sp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+ break;
-+ case NC_INT:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ attlen[0]=lenp;
-+ Clint_to_NArray(NArray,1,attlen,ip);
-+
-+ status = nc_get_att_int(ncid,varid,c_attname,ip);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+ break;
-+ case NC_FLOAT:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ attlen[0]=lenp;
-+ Cfloat_to_NArray(NArray,1,attlen,fp);
-+
-+ status = nc_get_att_float(ncid,varid,c_attname,fp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+ break;
-+ case NC_DOUBLE:
-+ status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ attlen[0]=lenp;
-+ Cdouble_to_NArray(NArray,1,attlen,dp);
-+
-+ status = nc_get_att_double(ncid,varid,c_attname,dp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+ break;
-+ default:
-+ rb_raise(rb_eNetcdfError,"atttype isn't supported in netCDF");
-+ }
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_var_inq_name(VALUE Var)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ char c_var_name[NC_MAX_NAME];
-+ struct NetCDFVar *Netcdf_var;
-+ VALUE Var_name;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varname(ncid,varid,c_var_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Var_name=rb_str_new2(c_var_name);
-+ OBJ_TAINT(Var_name);
-+ return Var_name;
-+}
-+
-+VALUE
-+NetCDF_var_ndims(VALUE Var)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ int ndimsp;
-+ struct NetCDFVar *Netcdf_var;
-+ VALUE Var_ndims;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ Var_ndims=INT2FIX(ndimsp);
-+ return Var_ndims;
-+}
-+
-+VALUE
-+NetCDF_var_vartype(VALUE Var)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ nc_type xtypep;
-+ struct NetCDFVar *Netcdf_var;
-+ const char *Vartype;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ status = nc_inq_vartype(ncid,varid,&xtypep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Vartype=nctype2natype(xtypep);
-+ return(rb_str_new2(Vartype));
-+}
-+
-+VALUE
-+NetCDF_var_typecode(VALUE Var)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ nc_type xtypep;
-+ struct NetCDFVar *Netcdf_var;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ status = nc_inq_vartype(ncid,varid,&xtypep);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ return(INT2NUM(nctype2natypecode(xtypep)));
-+}
-+
-+
-+VALUE
-+NetCDF_var_natts(VALUE Var)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ int nattsp;
-+ struct NetCDFVar *Netcdf_var;
-+ VALUE Var_natts;
-+
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ status= nc_inq_varnatts(ncid,varid,&nattsp);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ Var_natts=INT2FIX(nattsp);
-+ return Var_natts;
-+}
-+
-+VALUE
-+NetCDF_var_file(VALUE Var)
-+{
-+ struct NetCDFVar *Netcdf_var;
-+ /* VALUE file; */
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ return (Netcdf_var->file);
-+}
-+
-+VALUE
-+NetCDF_var_rename(VALUE Var,VALUE var_new_name)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ char *c_var_new_name;
-+ struct NetCDFVar *Netcdf_var;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Check_Type(var_new_name,T_STRING);
-+ c_var_new_name=StringValueCStr(var_new_name);
-+
-+ status = nc_rename_var(ncid,varid,c_var_new_name);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_var_att(VALUE Var,VALUE att_name)
-+{
-+ int ncid;
-+ int status;
-+ int varid;
-+ char *c_att_name;
-+ int c_attnump;
-+ struct NetCDFVar *Netcdf_var;
-+ struct NetCDFAtt *Netcdf_att;
-+ VALUE Att;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Check_Type(att_name,T_STRING);
-+ c_att_name=StringValueCStr(att_name);
-+
-+ status = nc_inq_attid(ncid,varid,c_att_name,&c_attnump);
-+ if(status == NC_NOERR){
-+ Netcdf_att=NetCDF_att_init(ncid,varid,c_att_name);
-+ Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-+ return Att;
-+ }
-+ else if(status == NC_ENOTATT){
-+ return Qnil;
-+ }
-+ else{
-+ NC_RAISE(status);
-+ return Qnil;
-+ }
-+}
-+
-+/* Redifinition of the "==" and "eql?" methods */
-+
-+VALUE
-+NetCDF_eql(VALUE filea,VALUE fileb)
-+{
-+ struct Netcdf *ncfilea;
-+ struct Netcdf *ncfileb;
-+
-+ if( rb_obj_is_kind_of(fileb, cNetCDF) ){
-+ Data_Get_Struct(filea,struct Netcdf,ncfilea);
-+ Data_Get_Struct(fileb,struct Netcdf,ncfileb);
-+
-+ if(ncfilea->ncid == ncfileb->ncid &&
-+ strcmp(ncfilea->name,ncfileb->name)==0){
-+ return Qtrue;
-+ } else {
-+ return Qfalse;
-+ }
-+ } else {
-+ return Qfalse;
-+ }
-+}
-+
-+VALUE
-+NetCDF_var_eql(VALUE Vara,VALUE Varb)
-+{
-+ struct NetCDFVar *Netcdf_vara;
-+ struct NetCDFVar *Netcdf_varb;
-+
-+ if( rb_obj_is_kind_of(Varb, cNetCDFVar) ){
-+ Data_Get_Struct(Vara,struct NetCDFVar,Netcdf_vara);
-+ Data_Get_Struct(Varb,struct NetCDFVar,Netcdf_varb);
-+
-+ if(Netcdf_vara->ncid == Netcdf_varb->ncid &&
-+ Netcdf_vara->varid == Netcdf_varb->varid){
-+ return Qtrue;
-+ } else {
-+ return Qfalse;
-+ }
-+ } else {
-+ return Qfalse;
-+ }
-+}
-+
-+VALUE
-+NetCDF_dim_eql(VALUE Dima,VALUE Dimb)
-+{
-+ struct NetCDFDim *Netcdf_dima;
-+ struct NetCDFDim *Netcdf_dimb;
-+
-+ if( rb_obj_is_kind_of(Dimb, cNetCDFDim) ){
-+ Data_Get_Struct(Dima,struct NetCDFDim,Netcdf_dima);
-+ Data_Get_Struct(Dimb,struct NetCDFDim,Netcdf_dimb);
-+
-+ if(Netcdf_dima->ncid == Netcdf_dimb->ncid &&
-+ Netcdf_dima->dimid == Netcdf_dimb->dimid){
-+ return Qtrue;
-+ } else {
-+ return Qfalse;
-+ }
-+ } else {
-+ return Qfalse;
-+ }
-+}
-+
-+VALUE
-+NetCDF_att_eql(VALUE Atta,VALUE Attb)
-+{
-+ struct NetCDFAtt *Netcdf_atta;
-+ struct NetCDFAtt *Netcdf_attb;
-+
-+ if( rb_obj_is_kind_of(Attb, cNetCDFAtt) ){
-+ Data_Get_Struct(Atta,struct NetCDFAtt,Netcdf_atta);
-+ Data_Get_Struct(Attb,struct NetCDFAtt,Netcdf_attb);
-+
-+ if(Netcdf_atta->ncid == Netcdf_atta->ncid &&
-+ Netcdf_atta->varid == Netcdf_attb->varid &&
-+ strcmp(Netcdf_atta->name,Netcdf_attb->name)==0){
-+ return Qtrue;
-+ } else {
-+ return Qfalse;
-+ }
-+ } else {
-+ return Qfalse;
-+ }
-+}
-+
-+/* Follow methods is to connect "NArray" with "Netcdf" */
-+VALUE
-+NetCDF_get_var_char(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_text(ncid,varid,(char *)ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var_byte(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_uchar(ncid,varid,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var_sint(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Csint_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_short(ncid,varid,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var_int(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Clint_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_int(ncid,varid,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var_float(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Cfloat_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_float(ncid,varid,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var_double(VALUE Var)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr;
-+ struct NetCDFVar *Netcdf_var;
-+ int i=0;
-+ int ndimsp;
-+ int *dimids;
-+ size_t lengthp;
-+ int *shape; /* NArray uses int instead of size_t */
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ dimids = ALLOCA_N(int,ndimsp);
-+ if (ndimsp != 0){
-+ shape = ALLOCA_N(int,ndimsp);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ shape[ndimsp-1-i]=lengthp;
-+ }
-+ } else {
-+ ndimsp = 1;
-+ shape = ALLOCA_N(int,1);
-+ shape[0]=1;
-+ }
-+
-+ Cdouble_to_NArray(NArray,ndimsp,shape,ptr);
-+
-+ status = nc_get_var_double(ncid,varid,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_var1_char(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR)NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ c_count[i]=1;
-+ nc_tlen = 1+nc_tlen;
-+ }
-+
-+
-+
-+
-+ Cbyte_to_NArray(NArray,ndims,c_count,ptr);
-+ status = nc_get_var1_text(ncid,varid,c_start,(char *)ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_var1_byte(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR)NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ c_count[i]=1;
-+ nc_tlen = 1+nc_tlen;
-+ }
-+
-+
-+
-+
-+ Cbyte_to_NArray(NArray,ndims,c_count,ptr);
-+ status = nc_get_var1_uchar(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_var1_sint(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ c_count[i]=1;
-+ nc_tlen = nc_tlen+1;
-+ }
-+
-+ Csint_to_NArray(NArray,ndims,c_count,ptr);
-+
-+ status = nc_get_var1_short(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_var1_int(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR)NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ c_count[i]=1;
-+ nc_tlen= nc_tlen+1;
-+ }
-+
-+ Clint_to_NArray(NArray,ndims,c_count,ptr);
-+
-+ status = nc_get_var1_int(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_var1_float(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR)NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ c_count[i]=1;
-+ nc_tlen = nc_tlen+1;
-+ }
-+
-+ Cfloat_to_NArray(NArray,ndims,c_count,ptr);
-+
-+ status = nc_get_var1_float(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_var1_double(VALUE Var,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int dimids[NC_MAX_DIMS];
-+ size_t dimlen;
-+ int *c_count;
-+ int nc_tlen=0;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR)NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ c_count=ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ c_count[i]=1;
-+ nc_tlen = nc_tlen+1;
-+ }
-+
-+ Cdouble_to_NArray(NArray,ndims,c_count,ptr);
-+
-+ status = nc_get_var1_double(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+
-+}
-+
-+VALUE
-+NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Cbyte_to_NArray(NArray,ndims,shape,ptr);
-+
-+ status = nc_get_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Cbyte_to_NArray(NArray,ndims,shape,ptr);
-+
-+ status = nc_get_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Csint_to_NArray(NArray,ndims,shape,ptr);
-+
-+
-+ status = nc_get_vars_short(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Clint_to_NArray(NArray,ndims,shape,ptr);
-+
-+
-+ status = nc_get_vars_int(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Cfloat_to_NArray(NArray,ndims,shape,ptr);
-+
-+
-+ status = nc_get_vars_float(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+VALUE
-+NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int *shape; /* NArray uses int instead of size_t */
-+ int ndims;
-+ int *dimids;
-+ int nc_tlen=1;
-+ size_t dimlen;
-+ VALUE NArray;
-+
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid = Netcdf_var->ncid;
-+ varid = Netcdf_var->varid;
-+
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ if(ndims == 0) {
-+ rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-+ }
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims){
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start = ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-+ }
-+ for(i=0;i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0){
-+ rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-+ }
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) <ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end +=dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ }
-+ }
-+
-+ for(i=0;i<ndims;i++){
-+ nc_tlen = nc_tlen*c_count[i];
-+ }
-+
-+ shape = ALLOCA_N(int,ndims);
-+ for(i=0;i<ndims;i++){
-+ shape[ndims-1-i]=c_count[i];
-+ }
-+
-+ Cdouble_to_NArray(NArray,ndims,shape,ptr);
-+
-+ status = nc_get_vars_double(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ OBJ_TAINT(NArray);
-+ return NArray;
-+}
-+
-+
-+VALUE
-+NetCDF_put_var_char(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Array_to_Cbyte_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(unsigned char,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status );
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array in the '%s'\n",var_name);
-+ }
-+ status = nc_put_var_text(ncid,varid,(char *)ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var_byte(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Array_to_Cbyte_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(unsigned char,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status );
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array in the '%s'\n",var_name);
-+ }
-+ status = nc_put_var_uchar(ncid,varid,ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var_short(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ Array_to_Csint_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(short,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-+ }
-+
-+ status = nc_put_var_short(ncid,varid,ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var_int(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Array_to_Clint_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(int,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-+ }
-+
-+
-+ status = nc_put_var_int(ncid,varid,ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_put_var_float(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Array_to_Cfloat_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(float,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-+ }
-+
-+ status = nc_put_var_float(ncid,varid,ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var_double(VALUE Var,VALUE NArray)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr,scalar;
-+ int len,i=0;
-+ struct NetCDFVar *Netcdf_var;
-+ int nc_tlen=1;
-+ int ndimsp;
-+ int dimids[NC_MAX_DIMS];
-+ size_t lengthp;
-+ char *var_name;
-+
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+
-+ Array_to_Cdouble_len(NArray,ptr,len);
-+
-+ status = nc_inq_varndims(ncid,varid,&ndimsp);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ for(i=0;i<ndimsp;i++){
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ nc_inq_dimlen(ncid,dimids[i],&lengthp);
-+ nc_tlen=lengthp*nc_tlen;
-+ }
-+ if(len == 1 && len != nc_tlen){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(double,nc_tlen);
-+ for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-+ } else if(len != nc_tlen){
-+ var_name=ALLOCA_N(char,NC_MAX_NAME);
-+ status = nc_inq_varname(ncid,varid,var_name);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-+ }
-+
-+ status = nc_put_var_double(ncid,varid,ptr);
-+ if(status !=NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var1_char(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Cbyte(NArray,ptr);
-+
-+ status = nc_put_var1_text(ncid,varid,c_start,(char *)ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var1_byte(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Cbyte(NArray,ptr);
-+
-+ status = nc_put_var1_uchar(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var1_sint(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Csint(NArray,ptr);
-+
-+ status = nc_put_var1_short(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+VALUE
-+NetCDF_put_var1_int(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Clint(NArray,ptr);
-+
-+ status = nc_put_var1_int(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var1_float(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Cfloat(NArray,ptr);
-+
-+ status = nc_put_var1_float(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_var1_double(VALUE Var,VALUE NArray,VALUE start)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr;
-+ int i;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start;
-+ size_t *c_start;
-+ int ndims;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid,varid,&ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+
-+ dimids = ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid,varid,dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) <ndims) {
-+ rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-+ }
-+
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0;i<ndims;i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+
-+ }
-+ Array_to_Cdouble(NArray,ptr);
-+
-+ status = nc_put_var1_double(ncid,varid,c_start,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Cbyte_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(unsigned char,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ unsigned char *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Cbyte_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(unsigned char,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+VALUE
-+NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ short *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Csint_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(short,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_short(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ int *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Clint_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(int,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "length of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_int(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ float *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Cfloat_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(float,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_float(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+
-+VALUE
-+NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-+{
-+ int ncid;
-+ int varid;
-+ int status;
-+ double *ptr,scalar;
-+ int len,i;
-+ int c_count_all=1;
-+ struct NetCDFVar *Netcdf_var;
-+ long l_start, l_end;
-+ size_t *c_start;
-+ size_t *c_count;
-+ ptrdiff_t *c_stride;
-+ int ndims;
-+ int *shape;
-+ int *dimids;
-+ size_t dimlen;
-+
-+ rb_secure(4);
-+ Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-+ ncid=Netcdf_var->ncid;
-+ varid=Netcdf_var->varid;
-+ status = nc_inq_varndims(ncid, varid, &ndims);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ dimids=ALLOCA_N(int,ndims);
-+ status = nc_inq_vardimid(ncid, varid, dimids);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+
-+ Check_Type(start,T_ARRAY);
-+ if(RARRAY_LEN(start) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ }
-+ c_start=ALLOCA_N(size_t,ndims);
-+ for(i=0; i<ndims; i++){
-+ l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-+
-+ if(l_start < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_start += dimlen;
-+ }
-+ c_start[i]=l_start;
-+ }
-+
-+ c_stride=ALLOCA_N(ptrdiff_t,ndims);
-+ switch(TYPE(stride)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=1;
-+ }
-+ break;
-+ default:
-+ Check_Type(stride,T_ARRAY);
-+ if(RARRAY_LEN(stride) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-+ if(c_stride[i]==0) {
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ }
-+ }
-+ }
-+
-+ Array_to_Cdouble_len_shape(NArray,ptr,len,shape);
-+
-+ c_count=ALLOCA_N(size_t,ndims);
-+ switch(TYPE(end)){
-+ case T_NIL:
-+ for(i=0; i<ndims; i++){
-+ c_count[i]=shape[i];
-+ }
-+ c_count_all=len;
-+ break;
-+ default:
-+ Check_Type(end,T_ARRAY);
-+ if(RARRAY_LEN(end) < ndims) {
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ }
-+ for(i=0; i<ndims; i++){
-+ l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-+ if(l_end < 0) {
-+ status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ l_end += dimlen;
-+ }
-+ c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-+ c_count_all=c_count[i]*c_count_all;
-+ }
-+ if(len == 1 && len != c_count_all){
-+ scalar = *ptr;
-+ ptr = ALLOCA_N(double,c_count_all);
-+ for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-+ } else if(len != c_count_all) {
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
-+ status = nc_put_vars_double(ncid,varid,c_start,c_count,c_stride,ptr);
-+ if(status != NC_NOERR) NC_RAISE(status);
-+ return Qnil;
-+}
-+
-+void
-+Init_netcdfraw(void)
-+{
-+ mNumRu = rb_define_module("NumRu");
-+
-+ /* Difinitions of the classes */
-+ cNetCDF = rb_define_class_under(mNumRu, "NetCDF", rb_cObject);
-+ cNetCDFDim = rb_define_class_under(mNumRu, "NetCDFDim", rb_cObject);
-+ cNetCDFAtt = rb_define_class_under(mNumRu, "NetCDFAtt", rb_cObject);
-+ cNetCDFVar = rb_define_class_under(mNumRu, "NetCDFVar", rb_cObject);
-+
-+ rb_eNetcdfError = rb_define_class("NetcdfError",rb_eStandardError);
-+ rb_eNetcdfBadid = rb_define_class("NetcdfBadid",rb_eNetcdfError);
-+ rb_eNetcdfNfile = rb_define_class("NetcdfNfile",rb_eNetcdfError);
-+ rb_eNetcdfExist = rb_define_class("NetcdfExist",rb_eNetcdfError);
-+ rb_eNetcdfInval = rb_define_class("NetcdfInval",rb_eNetcdfError);
-+ rb_eNetcdfPerm = rb_define_class("NetcdfPerm",rb_eNetcdfError);
-+ rb_eNetcdfNotindefine = rb_define_class("NetcdfNotindefine",rb_eNetcdfError);
-+ rb_eNetcdfIndefine = rb_define_class("NetcdfIndefine",rb_eNetcdfError);
-+ rb_eNetcdfInvalcoords = rb_define_class("NetcdfInvalcoords",rb_eNetcdfError);
-+ rb_eNetcdfMaxdims = rb_define_class("NetcdfMaxdims",rb_eNetcdfError);
-+ rb_eNetcdfNameinuse = rb_define_class("NetcdfNameinuse",rb_eNetcdfError);
-+ rb_eNetcdfNotatt = rb_define_class("NetcdfNotatt",rb_eNetcdfError);
-+ rb_eNetcdfMaxatts = rb_define_class("NetcdfMaxatts",rb_eNetcdfError);
-+ rb_eNetcdfBadtype = rb_define_class("NetcdfBadtype",rb_eNetcdfError);
-+ rb_eNetcdfBaddim = rb_define_class("NetcdfBaddim",rb_eNetcdfError);
-+ rb_eNetcdfUnlimpos = rb_define_class("NetcdFUnlimpos",rb_eNetcdfError);
-+ rb_eNetcdfMaxvars = rb_define_class("NetcdfMaxvars",rb_eNetcdfError);
-+ rb_eNetcdfNotvar = rb_define_class("NetcdfNotvar",rb_eNetcdfError);
-+ rb_eNetcdfGlobal = rb_define_class("NetcdfGlobal",rb_eNetcdfError);
-+ rb_eNetcdfNotnc = rb_define_class("NetcdfNotnc",rb_eNetcdfError);
-+ rb_eNetcdfSts = rb_define_class("NetcdfSts",rb_eNetcdfError);
-+ rb_eNetcdfMaxname = rb_define_class("NetcdfMaxname",rb_eNetcdfError);
-+ rb_eNetcdfUnlimit = rb_define_class("NetcdfUnlimit",rb_eNetcdfError);
-+ rb_eNetcdfNorecvars = rb_define_class("NetcdfNorecvars",rb_eNetcdfError);
-+ rb_eNetcdfChar = rb_define_class("NetcdfChar",rb_eNetcdfError);
-+ rb_eNetcdfEdge = rb_define_class("NetcdfEdge",rb_eNetcdfError);
-+ rb_eNetcdfStride = rb_define_class("NetcdfStride",rb_eNetcdfError);
-+ rb_eNetcdfBadname = rb_define_class("NetcdfBadname",rb_eNetcdfError);
-+ /* N.B. following must match value in ncx.h */
-+ rb_eNetcdfRange = rb_define_class("NetcdfRange",rb_eNetcdfError);
-+ rb_eNetcdfNomem = rb_define_class("NetcdfNomem",rb_eNetcdfError);
-+ /* Global error status */
-+ rb_eNetcdfEntool = rb_define_class("NetcdfEntool",rb_eNetcdfError);
-+ rb_eNetcdfExdr = rb_define_class("NetcdfExdr",rb_eNetcdfError);
-+ rb_eNetcdfSyserr = rb_define_class("NetcdfSyserr",rb_eNetcdfError);
-+ /* Global options variable. Used to determine behavior of error handler. */
-+ rb_eNetcdfFatal = rb_define_class("NetcdfFatal",rb_eNetcdfError);
-+
-+ /* Class Constants Definition */
-+ rb_define_const(cNetCDF, "NC_NOWRITE", INT2FIX(NC_NOWRITE));
-+ rb_define_const(cNetCDF, "NC_WRITE", INT2FIX(NC_WRITE));
-+ rb_define_const(cNetCDF, "NC_SHARE", INT2FIX(NC_SHARE));
-+ rb_define_const(cNetCDF, "NC_CLOBBER", INT2FIX(NC_CLOBBER));
-+ rb_define_const(cNetCDF, "NC_NOCLOBBER", INT2FIX(NC_NOCLOBBER));
-+
-+ /* Difinitions of the ruby methods */
-+ /* The methods of the NetCDF class */
-+ rb_define_singleton_method(cNetCDF,"nc_open",NetCDF_open,2);
-+ rb_define_method(cNetCDF,"clone",NetCDF_clone,0);
-+ rb_define_method(cNetCDF,"close",NetCDF_close,0);
-+ /* rb_define_singleton_method(cNetCDF,"new",NetCDF_open,2); */
-+ rb_define_singleton_method(cNetCDF,"nc_create",NetCDF_create,2);
-+ rb_define_method(cNetCDF,"def_dim",NetCDF_def_dim,2);
-+ rb_define_method(cNetCDF,"def_var",NetCDF_def_var,3);
-+ rb_define_method(cNetCDF,"put_attraw",NetCDF_put_att,3);
-+ rb_define_method(cNetCDF,"redef",NetCDF_redef,0);
-+ rb_define_method(cNetCDF,"enddef",NetCDF_enddef,0);
-+ rb_define_method(cNetCDF,"define_mode?",NetCDF_whether_in_define_mode,0);
-+ rb_define_method(cNetCDF,"fill",NetCDF_fill,1);
-+ rb_define_method(cNetCDF,"ndims",NetCDF_ndims,0);
-+ rb_define_method(cNetCDF,"nvars",NetCDF_nvars,0);
-+ rb_define_method(cNetCDF,"natts",NetCDF_natts,0);
-+ rb_define_method(cNetCDF,"sync",NetCDF_sync,0);
-+ rb_define_method(cNetCDF,"path",NetCDF_path,0);
-+ rb_define_method(cNetCDF,"dim",NetCDF_dim,1);
-+ rb_define_method(cNetCDF,"var",NetCDF_var,1);
-+ rb_define_method(cNetCDF,"att",NetCDF_att,1);
-+ rb_define_method(cNetCDF,"unlimited",NetCDF_unlimited,0);
-+ rb_define_private_method(cNetCDF,"id2var",NetCDF_id2var,1);
-+ rb_define_private_method(cNetCDF,"id2dim",NetCDF_id2dim,1);
-+ rb_define_private_method(cNetCDF,"id2att",NetCDF_id2att,1);
-+ rb_define_method(cNetCDF,"==",NetCDF_eql,1);
-+ /* rb_define_method(cNetCDF,"eql?",NetCDF_eql,1); */
-+
-+ /* The methods of the NetCDFDim class */
-+ rb_define_method(cNetCDFDim,"clone",NetCDF_dim_clone,0);
-+ rb_define_method(cNetCDFDim,"length",NetCDF_dim_length,0);
-+ rb_define_method(cNetCDFDim,"name=",NetCDF_dim_name,1);
-+ rb_define_method(cNetCDFDim,"name",NetCDF_dim_inqname,0);
-+ rb_define_method(cNetCDFDim,"unlimited?",NetCDF_dim_whether_unlimited,0);
-+ rb_define_method(cNetCDFDim,"==",NetCDF_dim_eql,1);
-+ /* rb_define_method(cNetCDFDim,"eql?",NetCDF_dim_eql,1); */
-+
-+ /* The methods of the NetCDFAtt class */
-+ rb_define_method(cNetCDFAtt,"clone",NetCDF_att_clone,0);
-+ rb_define_method(cNetCDFAtt,"name",NetCDF_att_inq_name,0);
-+ rb_define_method(cNetCDFAtt,"name=",NetCDF_att_rename,1);
-+ rb_define_method(cNetCDFAtt,"delete",NetCDF_att_delete,0);
-+ rb_define_method(cNetCDFAtt,"copy",NetCDF_att_copy,1);
-+ rb_define_method(cNetCDFAtt,"atttype",NetCDF_att_atttype,0);
-+ rb_define_method(cNetCDFAtt,"typecode",NetCDF_att_typecode,0);
-+ rb_define_method(cNetCDFAtt,"==",NetCDF_att_eql,1);
-+ /* rb_define_method(cNetCDFAtt,"eql?",NetCDF_att_eql,1); */
-+ rb_define_method(cNetCDFAtt,"putraw",NetCDF_att_put,2);
-+ rb_define_method(cNetCDFAtt,"get",NetCDF_att_get,0);
-+
-+ /* The methods of the NetCDFVar class */
-+ rb_define_method(cNetCDFVar,"clone",NetCDF_var_clone,0);
-+ rb_define_method(cNetCDFVar,"name",NetCDF_var_inq_name,0);
-+ rb_define_method(cNetCDFVar,"ndims",NetCDF_var_ndims,0);
-+ rb_define_method(cNetCDFVar,"vartype",NetCDF_var_vartype,0);
-+ rb_define_method(cNetCDFVar,"typecode",NetCDF_var_typecode,0);
-+ rb_define_method(cNetCDFVar,"ntype",NetCDF_var_vartype,0);
-+ rb_define_method(cNetCDFVar,"natts",NetCDF_var_natts,0);
-+ rb_define_method(cNetCDFVar,"file",NetCDF_var_file,0);
-+ rb_define_method(cNetCDFVar,"name=",NetCDF_var_rename,1);
-+ rb_define_method(cNetCDFVar,"att",NetCDF_var_att,1);
-+ rb_define_method(cNetCDFVar,"put_attraw",NetCDF_put_att_var,3);
-+ rb_define_method(cNetCDFVar,"dims",NetCDF_var_dims,0);
-+ rb_define_method(cNetCDFVar,"dim",NetCDF_var_dim,1);
-+ /*rb_define_private_method(cNetCDFVar,"id2dim",NetCDF_var_id2dim,1); */
-+ rb_define_private_method(cNetCDFVar,"id2att",NetCDF_var_id2att,1);
-+ rb_define_method(cNetCDFVar,"==",NetCDF_var_eql,1);
-+ /* rb_define_method(cNetCDFVar,"eql?",NetCDF_var_eql,1); */
-+
-+ /* The "get*" or "put*" methods in the NetCDFVar class */
-+ rb_define_method(cNetCDFVar,"put_var_char",NetCDF_put_var_char,1);
-+ rb_define_method(cNetCDFVar,"put_var_byte",NetCDF_put_var_byte,1);
-+ rb_define_method(cNetCDFVar,"put_var_sint",NetCDF_put_var_short,1);
-+ rb_define_method(cNetCDFVar,"put_var_int",NetCDF_put_var_int,1);
-+ rb_define_method(cNetCDFVar,"put_var_sfloat",NetCDF_put_var_float,1);
-+ rb_define_method(cNetCDFVar,"put_var_float",NetCDF_put_var_double,1);
-+
-+ rb_define_method(cNetCDFVar,"put_vars_char",NetCDF_put_vars_char,4);
-+ rb_define_method(cNetCDFVar,"put_vars_byte",NetCDF_put_vars_byte,4);
-+ rb_define_method(cNetCDFVar,"put_vars_sint",NetCDF_put_vars_sint,4);
-+ rb_define_method(cNetCDFVar,"put_vars_int",NetCDF_put_vars_int,4);
-+ rb_define_method(cNetCDFVar,"put_vars_sfloat",NetCDF_put_vars_float,4);
-+ rb_define_method(cNetCDFVar,"put_vars_float",NetCDF_put_vars_double,4);
-+
-+ rb_define_method(cNetCDFVar,"put_var1_char",NetCDF_put_var1_char,2);
-+ rb_define_method(cNetCDFVar,"put_var1_byte",NetCDF_put_var1_byte,2);
-+ rb_define_method(cNetCDFVar,"put_var1_sint",NetCDF_put_var1_sint,2);
-+ rb_define_method(cNetCDFVar,"put_var1_int",NetCDF_put_var1_int,2);
-+ rb_define_method(cNetCDFVar,"put_var1_sfloat",NetCDF_put_var1_float,2);
-+ rb_define_method(cNetCDFVar,"put_var1_float",NetCDF_put_var1_double,2);
-+
-+ rb_define_method(cNetCDFVar,"get_var_char",NetCDF_get_var_char,0);
-+ rb_define_method(cNetCDFVar,"get_var_byte",NetCDF_get_var_byte,0);
-+ rb_define_method(cNetCDFVar,"get_var_sint",NetCDF_get_var_sint,0);
-+ rb_define_method(cNetCDFVar,"get_var_int",NetCDF_get_var_int,0);
-+ rb_define_method(cNetCDFVar,"get_var_sfloat",NetCDF_get_var_float,0);
-+ rb_define_method(cNetCDFVar,"get_var_float",NetCDF_get_var_double,0);
-+
-+ rb_define_method(cNetCDFVar,"get_vars_char",NetCDF_get_vars_char,3);
-+ rb_define_method(cNetCDFVar,"get_vars_byte",NetCDF_get_vars_byte,3);
-+ rb_define_method(cNetCDFVar,"get_vars_sint",NetCDF_get_vars_sint,3);
-+ rb_define_method(cNetCDFVar,"get_vars_int",NetCDF_get_vars_int,3);
-+ rb_define_method(cNetCDFVar,"get_vars_sfloat",NetCDF_get_vars_float,3);
-+ rb_define_method(cNetCDFVar,"get_vars_float",NetCDF_get_vars_double,3);
-+
-+ rb_define_method(cNetCDFVar,"get_var1_char",NetCDF_get_var1_char,1);
-+ rb_define_method(cNetCDFVar,"get_var1_byte",NetCDF_get_var1_byte,1);
-+ rb_define_method(cNetCDFVar,"get_var1_sint",NetCDF_get_var1_sint,1);
-+ rb_define_method(cNetCDFVar,"get_var1_int",NetCDF_get_var1_int,1);
-+ rb_define_method(cNetCDFVar,"get_var1_sfloat",NetCDF_get_var1_float,1);
-+ rb_define_method(cNetCDFVar,"get_var1_float",NetCDF_get_var1_double,1);
-+}
-diff --git a/extconf.rb b/extconf.rb
-deleted file mode 100644
-index 5e53471..0000000
---- a/extconf.rb
-+++ /dev/null
-@@ -1,124 +0,0 @@
--require "mkmf"
--
--dir_config('narray',$vendorarchdir,$vendorarchdir)
--dir_config('netcdf','/usr/')
--
--if ( ! ( have_header("narray.h") && have_header("narray_config.h") ) ) then
--print <<EOS
--** configure error **
-- Header narray.h or narray_config.h is not found. If you have these files in
-- /narraydir/include, try the following:
--
-- % ruby extconf.rb --with-narray-include=/narraydir/include
--
--EOS
-- exit(-1)
--end
--
--if xsystem("ncdap-config --libs")
-- libncdods = "nc-dap"
-- cflags = `ncdap-config --cflags`.gsub(/\n/, " ")
-- libs = `ncdap-config --libs`.gsub(/\n/, " ")
-- prefix_dods = `ncdap-config --prefix`.gsub(/\n/, "")
--elsif xsystem("opendap-config --libs")
-- libncdods = "nc-dods"
-- cflags = `opendap-config --cflags`.gsub(/\n/, " ")
-- libs = `opendap-config --libs-nc`.gsub(/\n/, " ")
-- prefix_dods = `opendap-config --prefix`.gsub(/\n/, "")
--end
--
--if (enable_config('opendap',true) && ( xsystem("opendap-config --libs") ||
-- xsystem("ncdap-config --libs") ) )
--
-- dir_config(libncdods,prefix_dods)
--
-- if (!have_library(libncdods))
-- print <<-EOS
-- ** ERROR ** Library not found: nc-dods (OPeNDAP/DODS-enabled NetCDF lib)
-- Install it, or run extconf.rb with option --disable-opendap.
-- ^^^^^^^^^^^^^^^^^
-- EOS
-- exit(-1)
-- else
-- print <<-EOS
-- ** Message ** Compiling with OPeNDAP/DODS-enabled NetCDF library.
--
-- This is because the command opendap-config is found in your system.
-- If you want to use the ordinary (non-DODS) version of NetCDF,
-- run extconf.rb with option --disable-opendap.
-- ^^^^^^^^^^^^^^^^^
-- EOS
-- end
--
-- $CFLAGS += ' '+cflags
-- $LOCAL_LIBS += ' ' + libs
--
-- # non portable treatments: should be improved (by Horinouchi)
-- CONFIG['LDSHARED'].sub!(/gcc/,'g++')
-- $LIBS.sub!(/-lc\s/,'') ; $LIBS.sub!(/-lc$/,'')
-- print <<-EOS
-- ** Warning ** non-portable treatments are made,
-- which was sucessfull redhat linux 9:
-- * gcc was replaced with g++ in CONFIG['LDSHARED']
-- * -lc library was removed if in $LIBS
--
-- EOS
-- # p '@@@'
-- # ary = []
-- # CONFIG.each{|k,v| ary.push([k,v])}
-- # ary.sort.each{|x| p x}
--else
-- if xsystem("nc-config --libs") # for NetCDF 4
-- cflags = `nc-config --cflags`.gsub(/\n/, " ")
-- libs = `nc-config --libs`.gsub(/\n/, " ")
-- prefix_nc = `nc-config --prefix`.gsub(/\n/, "")
--
-- dir_config("netcdf",prefix_nc)
-- $CFLAGS += ' ' + cflags
-- $LOCAL_LIBS += ' ' + libs
-- end
-- if ( ! ( have_header("netcdf.h") && have_library("netcdf") ) )then
-- print <<-EOS
-- ** configure error **
-- Header netcdf.h or the compiled netcdf library is not found.
-- If you have the library installed under /netcdfdir (that is, netcdf.h is
-- in /netcdfdir/include and the library in /netcdfdir/lib/),
-- try the following:
--
-- % ruby extconf.rb --with-netcdf-dir=/netcdfdir
--
-- Alternatively, you can specify the two directory separately
-- with --with-netcdf-include and --with-netcdf-lib.
-- EOS
-- exit(-1)
-- end
--end
--
--if /cygwin|mingw/ =~ RUBY_PLATFORM
-- have_library("narray") || raise("ERROR: narray library is not found")
--end
--
--create_makefile "numru/netcdfraw"
--
--###### Modify Makefile: #######
--File.rename("Makefile","Makefile.orig")
--oldmkfl = File.open("Makefile.orig")
--newmkfl = File.open("Makefile","w")
--oldmkfl.each_line{ |line|
-- case(line)
-- when /^distclean:/
-- newmkfl.puts(line)
-- newmkfl.puts("\t\t@$(RM) *.nc demo/*.nc demo/*~ lib/*~ doc/*~ test/*.nc test/*~ Makefile.orig")
-- when /^all:/
-- newmkfl.puts(line)
-- newmkfl.puts("")
-- newmkfl.puts("test: all") # insert the "test" target
-- newmkfl.puts("\t\t at cd test && ruby test.rb && echo 'test did not fail :-p (please ignore the warnings)' && cd ..")
-- when /lib\/netcdf/
-- line = line.chomp! + "/"
-- newmkfl.puts(line)
-- else
-- newmkfl.puts(line)
-- end
--}
--newmkfl.close
-diff --git a/lib/netcdf.rb b/lib/netcdf.rb
-deleted file mode 100644
-index aaba6d2..0000000
---- a/lib/netcdf.rb
-+++ /dev/null
-@@ -1,792 +0,0 @@
--require 'narray'
--require 'numru/netcdfraw'
--
--# NetCDF$B%/%i%9$K4X$7$F(B
--module NumRu
-- class NetCDF
--
-- Max_Try = 100
--
-- def NetCDF.open(filename,mode="r",share=false)
-- call_create=false # false-> nc_open; true->nc_create
-- case(mode)
-- when "r","rb" # read only
-- mode=NC_NOWRITE
-- when "w","w+","wb","w+b" # overwrite if exits
-- call_create=true
-- mode=NC_CLOBBER
-- when "a","a+","r+","ab","a+b","r+b" # append if exits
-- if( File.exists?(filename) )
-- mode=NC_WRITE
-- else
-- call_create=true #(nonexsitent --> create)
-- mode=NC_CLOBBER
-- end
-- else
-- raise NetcdfError, "Mode #{mode} is not supported"
-- end
-- case(share)
-- when false
-- share=0
-- when true
-- share=NC_SHARE
-- else
-- raise NetcdfError, "We can't use the sharing mode you typed"
-- end
-- omode = mode | share
-- if(!call_create)
-- nc_open(filename,omode)
-- else
-- nc_create(filename,omode)
-- end
-- end
--
-- class << NetCDF
-- alias new open
-- end
--
--
-- def NetCDF.create(filename,noclobber=false,share=false)
-- case(noclobber)
-- when false
-- noclobber=NC_CLOBBER
-- when true
-- noclobber=NC_NOCLOBBER
-- else
-- raise NetcdfError,"noclobber (2nd argument) must be true or false"
-- end
-- case(share)
-- when false
-- share=0
-- when true
-- share=NC_SHARE
-- else
-- raise NetcdfError,"share (3rd argument) must be true or false"
-- end
--
-- cmode=noclobber | share
-- nc_create(filename,cmode)
-- end
--
-- class << NetCDF
-- def clean_tmpfile(path)
-- proc {
-- print "removing ", path, "..." if $DEBUG
-- if File.exist?(path)
-- File.unlink(path)
-- end
-- print "done\n" if $DEBUG
-- }
-- end
-- protected :clean_tmpfile
-- end
--
-- def NetCDF.create_tmp(tmpdir=ENV['TMPDIR']||ENV['TMP']||ENV['TEMP']||'.',
-- share=false)
-- basename = 'temp'
-- if $SAFE > 0 and tmpdir.tainted?
-- tmpdir = '.'
-- end
--
-- n = 0
-- while true
-- begin
-- tmpname = sprintf('%s/%s%d_%d.nc', tmpdir, basename, $$, n)
-- unless File.exist?(tmpname)
-- netcdf = NetCDF.create(tmpname, true, share)
-- ObjectSpace.define_finalizer(netcdf,
-- NetCDF.clean_tmpfile(tmpname))
-- break
-- end
-- rescue
-- raise NetcdfError, "cannot generate tempfile `%s'" % tmpname if n >= Max_Try
-- end
-- n += 1
-- end
-- netcdf
-- end
--
--
-- def put_att(attname,val,atttype=nil)
-- put_attraw(attname,val,atttype)
-- end
--
-- def def_var_with_dim(name, vartype, shape_ul0, dimnames)
-- # Same as def_var but defines dimensions first if needed.
-- # Use zero in shape to define an unlimited dimension.
-- if (shape_ul0.length != dimnames.length ) then
-- raise ArgumentError, 'lengths of shape and dimnames do not agree'
-- end
-- dims = []
-- dimnames.each_index{ |i|
-- dim = self.dim( dimnames[i] )
-- if ( dim != nil ) then
-- # dim exists --> check the length
-- if (shape_ul0[i] != dim.length_ul0 ) then
-- raise ArgumentError, "dimension length do not agree: #{i}th dim: "+\
-- "#{shape_ul0[i]} and #{dim.length_ul0}"
-- end
-- dims.push(dim)
-- else
-- # dim does not exist --> define it
-- dims.push( def_dim( dimnames[i], shape_ul0[i] ) )
-- end
-- }
-- def_var(name, vartype, dims)
-- end
--
-- # Iterators:
-- def each_dim
-- num_dim=ndims()
-- for dimid in 0..num_dim-1
-- obj_Dim=id2dim(dimid)
-- yield(obj_Dim)
-- end
-- end
--
-- def each_var
-- num_var=nvars()
-- for varid in 0..num_var-1
-- obj_Var=id2var(varid)
-- yield(obj_Var)
-- end
-- end
--
-- def each_att
-- num_att=natts()
-- for attnum in 0..num_att-1
-- obj_Att=id2att(attnum)
-- yield(obj_Att)
-- end
-- end
--
-- def dims( names=nil ) # return all if names==nil
-- if names == nil
-- dims = (0..ndims()-1).collect{|dimid| id2dim(dimid)}
-- else
-- raise TypeError, "names is not an array" if ! names.is_a?(Array)
-- dims = names.collect{|name| dim(name)}
-- raise ArgumentError, "One or more dimensions do not exist" if dims.include?(nil)
-- end
-- dims
-- end
--
-- def vars( names=nil ) # return all if names==nil
-- if names == nil
-- vars = (0..nvars()-1).collect{ |varid| id2var(varid) }
-- else
-- raise TypeError, "names is not an array" if ! names.is_a?(Array)
-- vars = names.collect{|name| var(name)}
-- raise ArgumentError, "One or more variables do not exist" if vars.include?(nil)
-- end
-- vars
-- end
--
-- def dim_names
-- num_dim=ndims()
-- names=[]
-- for dimid in 0..num_dim-1
-- obj_Dim=id2dim(dimid)
-- names=names+[obj_Dim.name]
-- end
-- return names
-- end
--
-- def var_names
-- num_var=nvars()
-- names=[]
-- for varid in 0..num_var-1
-- obj_Var=id2var(varid)
-- names=names+[obj_Var.name]
-- end
-- return names
-- end
--
-- def att_names
-- num_att=natts()
-- names=[]
-- for attnum in 0..num_att-1
-- obj_Att=id2att(attnum)
-- names=names+[obj_Att.name]
-- end
-- return names
-- end
--
-- def inspect
-- "NetCDF:"+path
-- end
--
-- end
--
-- #NetCDFVar class $B$K4X$7$F(B
-- class NetCDFVar
--
-- class << NetCDFVar
-- def new(file,varname,mode="r",share=false)
-- if(file.is_a?(String))
-- file = NetCDF.open(file,mode,share)
-- elsif(!file.is_a?(NetCDF))
-- raise TypeError, "1st arg must be a NetCDF (file object) or a String (path)"
-- end
-- file.var(varname)
-- end
--
-- alias open new
-- end
--
-- alias :rank :ndims
--
-- def each_att
-- num_att=natts()
-- for attnum in 0..num_att-1
-- obj_Att=id2att(attnum)
-- yield(obj_Att)
-- end
-- end
--
-- def dim_names
-- ary = Array.new()
-- dims.each{|dim| ary.push(dim.name)}
-- ary
-- end
--
-- def att_names
-- num_att=natts()
-- names=[]
-- for attnum in 0..num_att-1
-- obj_Att=id2att(attnum)
-- names=names+[obj_Att.name]
-- end
-- return names
-- end
--
-- def put_att(attname,val,atttype=nil)
-- put_attraw(attname,val,atttype)
-- end
--
-- def shape_ul0
-- sh = []
-- dims.each{|d|
-- if d.unlimited? then
-- sh.push(0)
-- else
-- sh.push(d.length)
-- end
-- }
-- sh
-- end
--
-- def shape_current
-- sh = []
-- dims.each{|d|
-- sh.push(d.length)
-- }
-- sh
-- end
--
-- # The put and get methods in the NetCDFVar class
--
-- def pack(na)
-- sf = att('scale_factor')
-- ao = att('add_offset')
-- if ( sf == nil && ao == nil ) then
-- na
-- else
-- na = NArray.to_na(na) if na.is_a?(Array)
-- if sf
-- csf = sf.get
-- raise NetcdfError,"scale_factor is not a numeric" if csf.is_a?(String)
-- raise NetcdfError, "scale_factor is not unique" if csf.length != 1
-- raise NetcdfError, "zero scale_factor" if csf[0] == 0
-- else
-- csf = nil
-- end
-- if ao
-- cao = ao.get
-- raise NetcdfError, "add_offset is not a numeric" if cao.is_a?(String)
-- raise NetcdfError, "add_offset is not unique" if cao.length != 1
-- else
-- cao = nil
-- end
-- if csf and cao
-- packed = (na - cao) / csf
-- elsif csf
-- packed = na / csf
-- elsif cao
-- packed = na - cao
-- end
-- if self.typecode <= NArray::LINT
-- packed = packed.round
-- end
-- packed
-- end
-- end
--
-- def scaled_put(var,hash=nil)
-- simple_put( pack(var), hash)
-- end
--
-- @@unpack_type = nil
-- class << NetCDFVar
-- def unpack_type
-- @@unpack_type
-- end
-- def unpack_type=(na_type)
-- if [NArray::BYTE, NArray::SINT, NArray::INT,
-- NArray::SFLOAT, NArray::FLOAT, nil].include?(na_type)
-- @@unpack_type = na_type
-- else
-- raise ArgumentError, "Arg must be one of NArray::BYTE, NArray::SINT, NArray::INT, NArray::SFLOAT, NArray::FLOAT"
-- end
-- end
--
-- end
--
-- def unpack(na)
-- sf = att('scale_factor')
-- ao = att('add_offset')
-- if ( sf == nil && ao == nil ) then
-- na
-- else
-- if sf
-- csf = sf.get
-- raise NetcdfError,"scale_factor is not a numeric" if csf.is_a?(String)
-- raise NetcdfError, "scale_factor is not unique" if csf.length != 1
-- raise NetcdfError, "zero scale_factor" if csf[0] == 0
-- else
-- csf =nil
-- end
-- if ao
-- cao = ao.get
-- raise NetcdfError, "add_offset is not a numeric" if cao.is_a?(String)
-- raise NetcdfError, "add_offset is not unique" if cao.length != 1
-- else
-- cao = nil
-- end
-- if csf and cao
-- una = na * csf + cao # csf & cao are NArray -> coerced to their types
-- elsif csf
-- una = na * csf
-- elsif cao
-- una = na + cao
-- end
-- una = una.to_type(@@unpack_type) if @@unpack_type
-- una
-- end
-- end
--
-- def scaled_get(hash=nil)
-- unpack( simple_get(hash) )
-- end
--
-- def simple_put(var,hash=nil)
-- if hash==nil
-- if self.vartype == "char"
-- put_var_char(var)
-- elsif self.vartype == "byte"
-- put_var_byte(var)
-- elsif self.vartype == "sint"
-- put_var_sint(var)
-- elsif self.vartype == "int"
-- put_var_int(var)
-- elsif self.vartype == "sfloat"
-- put_var_sfloat(var)
-- elsif self.vartype == "float"
-- put_var_float(var)
-- else
-- raise NetcdfError,"variable type isn't supported in netCDF"
-- end
-- elsif hash.key?("index")==true
-- if self.vartype == "char"
-- put_var1_char(var,hash["index"])
-- elsif self.vartype=="byte"
-- put_var1_byte(var,hash["index"])
-- elsif self.vartype=="sint"
-- put_var1_sint(var,hash["index"])
-- elsif self.vartype == "int"
-- put_var1_int(var,hash["index"])
-- elsif self.vartype == "sfloat"
-- put_var1_sfloat(var,hash["index"])
-- elsif self.vartype == "float"
-- put_var1_float(var,hash["index"])
-- else
-- raise NetcdfError,"variable type isn't supported in netCDF"
-- end
-- elsif hash.key?("start")==true
-- if hash.key?("end")==false && hash.key?("stride")==false
-- if self.vartype == "char"
-- put_vars_char(var,hash["start"],nil,nil)
-- elsif self.vartype=="byte"
-- put_vars_byte(var,hash["start"],nil,nil)
-- elsif self.vartype=="sint"
-- put_vars_sint(var,hash["start"],nil,nil)
-- elsif self.vartype=="int"
-- put_vars_int(var,hash["start"],nil,nil)
-- elsif self.vartype=="sfloat"
-- put_vars_sfloat(var,hash["start"],nil,nil)
-- elsif self.vartype=="float"
-- put_vars_float(var,hash["start"],nil,nil)
-- else
-- raise NetcdfError, "variable type isn't supported in netCDF"
-- end
-- elsif hash.key?("end")==true && hash.key?("stride") == false
-- if self.vartype == "char"
-- put_vars_char(var,hash["start"],hash["end"],nil)
-- elsif self.vartype=="byte"
-- put_vars_byte(var,hash["start"],hash["end"],nil)
-- elsif self.vartype=="sint"
-- put_vars_sint(var,hash["start"],hash["end"],nil)
-- elsif self.vartype=="int"
-- put_vars_int(var,hash["start"],hash["end"],nil)
-- elsif self.vartype == "sfloat"
-- put_vars_sfloat(var,hash["start"],hash["end"],nil)
-- elsif self.vartype =="float"
-- put_vars_float(var,hash["start"],hash["end"],nil)
-- else
-- raise NetcdfError, "variable type isn't supported in netCDF"
-- end
-- elsif hash.key?("end")==false && hash.key?("stride")==true
-- if self.vartype == "char"
-- put_vars_char(var,hash["start"],nil,hash["stride"])
-- elsif self.vartype=="byte"
-- put_vars_byte(var,hash["start"],nil,hash["stride"])
-- elsif self.vartype=="sint"
-- put_vars_sint(var,hash["start"],nil,hash["stride"])
-- elsif self.vartype=="int"
-- put_vars_int(var,hash["start"],nil,hash["stride"])
-- elsif self.vartype=="sfloat"
-- put_vars_sfloat(var,hash["start"],nil,hash["stride"])
-- elsif self.vartype=="float"
-- put_vars_float(var,hash["start"],nil,hash["stride"])
-- else
-- raise NetcdfError, "variable type isn't supported in netCDF"
-- end
-- else hash.key?("end")==true && hash.key?("stride")==true
-- if self.vartype == "char"
-- put_vars_char(var,hash["start"],hash["end"],hash["stride"])
-- elsif self.vartype=="byte"
-- put_vars_byte(var,hash["start"],hash["end"],hash["stride"])
-- elsif self.vartype=="sint"
-- put_vars_sint(var,hash["start"],hash["end"],hash["stride"])
-- elsif self.vartype=="int"
-- put_vars_int(var,hash["start"],hash["end"],hash["stride"])
-- elsif self.vartype=="sfloat"
-- put_vars_sfloat(var,hash["start"],hash["end"],hash["stride"])
-- elsif self.vartype=="float"
-- put_vars_float(var,hash["start"],hash["end"],hash["stride"])
-- else
-- raise NetcdfError, "variable type isn't supported in netCDF"
-- end
-- end
-- else
-- raise ArgumentError,"{'start'}=>[ARRAY] or {'index'}=>[ARRAY] is needed"
-- end
-- end
--
-- alias put simple_put
--
-- def simple_get(hash=nil)
-- t_var = self.vartype
-- if hash == nil
-- if t_var == "char"
-- get_var_char
-- elsif t_var == "byte"
-- get_var_byte
-- elsif t_var == "sint"
-- get_var_sint
-- elsif t_var == "int"
-- get_var_int
-- elsif t_var == "sfloat"
-- get_var_sfloat
-- elsif t_var == "float"
-- get_var_float
-- else
-- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-- end
-- elsif hash.key?("index")==true
-- ind = hash["index"]
-- if t_var == "char"
-- get_var1_char(ind)
-- elsif t_var == "byte"
-- get_var1_byte(ind)
-- elsif t_var == "sint"
-- get_var1_sint(ind)
-- elsif t_var == "int"
-- get_var1_int(ind)
-- elsif t_var == "sfloat"
-- get_var1_sfloat(ind)
-- elsif t_var == "float"
-- get_var1_float(ind)
-- else
-- raise NetcdfError,"variable type #{t_var} isn't supported in netCDF"
-- end
-- elsif hash.key?("start")==true
-- h_sta = hash["start"]
-- endq = hash.key?("end")
-- strq = hash.key?("stride")
-- if endq == false && strq == false
-- if t_var == "char"
-- get_vars_char(h_sta,nil,nil)
-- elsif t_var == "byte"
-- get_vars_byte(h_sta,nil,nil)
-- elsif t_var == "sint"
-- get_vars_sint(h_sta,nil,nil)
-- elsif t_var == "int"
-- get_vars_int(h_sta,nil,nil)
-- elsif t_var == "sfloat"
-- get_vars_sfloat(h_sta,nil,nil)
-- elsif t_var == "float"
-- get_vars_float(h_sta,nil,nil)
-- else
-- raise NetcdfError, "varialbe type #{t_var} isn't supported in netCDF"
-- end
-- elsif endq == true && strq == false
-- h_end = hash["end"]
-- if t_var == "char"
-- get_vars_char(h_sta,h_end,nil)
-- elsif t_var == "byte"
-- get_vars_byte(h_sta,h_end,nil)
-- elsif t_var == "sint"
-- get_vars_sint(h_sta,h_end,nil)
-- elsif t_var == "int"
-- get_vars_int(h_sta,h_end,nil)
-- elsif t_var == "sfloat"
-- get_vars_sfloat(h_sta,h_end,nil)
-- elsif t_var == "float"
-- get_vars_float(h_sta,h_end,nil)
-- else
-- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-- end
-- elsif endq == false && strq == true
-- h_str = hash["stride"]
-- if t_var == "char"
-- get_vars_char(h_sta,nil,h_str)
-- elsif t_var == "byte"
-- get_vars_byte(h_sta,nil,h_str)
-- elsif t_var == "sint"
-- get_vars_sint(h_sta,nil,h_str)
-- elsif t_var == "int"
-- get_vars_int(h_sta,nil,h_str)
-- elsif t_var == "sfloat"
-- get_vars_sfloat(h_sta,nil,h_str)
-- elsif t_var == "float"
-- get_vars_float(h_sta,nil,h_str)
-- else
-- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-- end
-- else endq == true && strq == true
-- h_end = hash["end"]
-- h_str = hash["stride"]
-- if t_var == "char"
-- get_vars_char(h_sta,h_end,h_str)
-- elsif t_var == "byte"
-- get_vars_byte(h_sta,h_end,h_str)
-- elsif t_var == "sint"
-- get_vars_sint(h_sta,h_end,h_str)
-- elsif t_var == "int"
-- get_vars_int(h_sta,h_end,h_str)
-- elsif t_var == "sfloat"
-- get_vars_sfloat(h_sta,h_end,h_str)
-- elsif t_var == "float"
-- get_vars_float(h_sta,h_end,h_str)
-- else
-- raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-- end
-- end
-- else
-- raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
-- end
-- end
--
-- alias get simple_get
--
-- def __rubber_expansion( args )
-- if (id = args.index(false)) # substitution into id
-- # false is incuded
-- alen = args.length
-- if args.rindex(false) != id
-- raise ArguemntError,"only one rubber dimension is permitted"
-- elsif alen > rank+1
-- raise ArgumentError, "too many args"
-- end
-- ar = ( id!=0 ? args[0..id-1] : [] )
-- args = ar + [true]*(rank-alen+1) + args[id+1..-1]
-- elsif args.length == 0 # to support empty [], []=
-- args = [true]*rank
-- end
-- args
-- end
-- private :__rubber_expansion
--
-- def [](*a)
-- if a.length == 0
-- return self.get
-- end
-- a = __rubber_expansion(a)
-- first = Array.new
-- last = Array.new
-- stride = Array.new
-- set_stride = false
-- a.each{|i|
-- if(i.is_a?(Fixnum))
-- first.push(i)
-- last.push(i)
-- stride.push(1)
-- elsif(i.is_a?(Range))
-- first.push(i.first)
-- last.push(i.exclude_end? ? i.last-1 : i.last)
-- stride.push(1)
-- elsif(i.is_a?(Hash))
-- r = (i.to_a[0])[0]
-- s = (i.to_a[0])[1]
-- if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
-- raise TypeError, "Hash argument must be {a_Range, step}"
-- end
-- first.push(r.first)
-- last.push(r.exclude_end? ? r.last-1 : r.last)
-- stride.push(s)
-- set_stride = true
-- elsif(i.is_a?(TrueClass))
-- first.push(0)
-- last.push(-1)
-- stride.push(1)
-- elsif( i.is_a?(Array) || i.is_a?(NArray))
-- a_new = a.dup
-- at = a.index(i)
-- i = NArray.to_na(i) if i.is_a?(Array)
-- for n in 0..i.length-1
-- a_new[at] = i[n]..i[n]
-- na_tmp = self[*a_new]
-- if n==0 then
-- k = at
-- if at > 0
-- a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
-- end
-- shape_tmp = na_tmp.shape
-- shape_tmp[k] = i.length
-- na = na_tmp.class.new(na_tmp.typecode,*shape_tmp)
-- index_tmp = Array.new(shape_tmp.length,true)
-- end
-- index_tmp[k] = n..n
-- na[*index_tmp] = na_tmp
-- end
-- return na
-- else
-- raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
-- end
-- }
--
-- if(set_stride)
-- na = self.get({"start"=>first, "end"=>last, "stride"=>stride})
-- else
-- na = self.get({"start"=>first, "end"=>last})
-- end
-- shape = na.shape
-- (a.length-1).downto(0){ |i|
-- shape.delete_at(i) if a[i].is_a?(Fixnum)
-- }
-- na.reshape!( *shape )
-- na
-- end
--
-- def []=(*a)
-- val = a.pop
-- a = __rubber_expansion(a)
-- first = Array.new
-- last = Array.new
-- stride = Array.new
-- set_stride = false
-- a.each{|i|
-- if(i.is_a?(Fixnum))
-- first.push(i)
-- last.push(i)
-- stride.push(1)
-- elsif(i.is_a?(Range))
-- first.push(i.first)
-- last.push(i.exclude_end? ? i.last-1 : i.last)
-- stride.push(1)
-- elsif(i.is_a?(Hash))
-- r = (i.to_a[0])[0]
-- s = (i.to_a[0])[1]
-- if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
-- raise ArgumentError, "Hash argument must be {first..last, step}"
-- end
-- first.push(r.first)
-- last.push(r.exclude_end? ? r.last-1 : r.last)
-- stride.push(s)
-- set_stride = true
-- elsif(i.is_a?(TrueClass))
-- first.push(0)
-- last.push(-1)
-- stride.push(1)
-- elsif(i.is_a?(Array) || i.is_a?(NArray))
-- a_new = a.dup
-- at = a.index(i)
-- i = NArray.to_na(i) if i.is_a?(Array)
-- val = NArray.to_na(val) if val.is_a?(Array)
-- rank_of_subset = a.dup.delete_if{|v| v.is_a?(Fixnum)}.length
-- if val.rank != rank_of_subset
-- raise "rank of the rhs (#{val.rank}) is not equal to the rank "+
-- "of the subset specified by #{a.inspect} (#{rank_of_subset})"
-- end
-- k = at
-- a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
-- if i.length != val.shape[k]
-- raise "length of the #{k+1}-th dim of rhs is incorrect "+
-- "(#{i.length} for #{val.shape[k]})"
-- end
-- index_tmp = Array.new(val.rank,true) if !val.is_a?(Numeric) #==>Array-like
-- for n in 0..i.length-1
-- a_new[at] = i[n]..i[n]
-- if !val.is_a?(Numeric) then
-- index_tmp[k] = n..n
-- self[*a_new] = val[*index_tmp]
-- else
-- self[*a_new] = val
-- end
-- end
-- return self
-- else
-- raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
-- end
-- }
--
-- if(set_stride)
-- self.put(val, {"start"=>first, "end"=>last, "stride"=>stride})
-- else
-- self.put(val, {"start"=>first, "end"=>last})
-- end
-- end
--
-- def inspect
-- 'NetCDFVar:'+file.path+'?var='+name
-- end
--
-- end
--
-- class NetCDFAtt
--
-- def put(val,atttype=nil)
-- putraw(val,atttype)
-- end
--
-- def inspect
-- 'NetCDFAtt:'+name
-- end
-- end
--
-- class NetCDFDim
-- def inspect
-- 'NetCDFDim:'+name
-- end
--
-- def length_ul0
-- if unlimited?
-- 0
-- else
-- length
-- end
-- end
--
-- end
--end
-diff --git a/lib/netcdf_miss.rb b/lib/netcdf_miss.rb
-deleted file mode 100644
-index 4b168f0..0000000
---- a/lib/netcdf_miss.rb
-+++ /dev/null
-@@ -1,203 +0,0 @@
--require "numru/netcdf"
--require "narray_miss"
--
--module NumRu
--
-- class NetCDFVar
--
-- def get_with_miss(*args)
-- __interpret_missing_params if !defined?(@missval)
-- data = simple_get(*args)
-- if @vmin || @vmax
-- if @vmin
-- mask = (data >= @vmin)
-- mask = mask.and(data <= @vmax) if @vmax
-- else
-- mask = (data <= @vmax)
-- end
-- data = NArrayMiss.to_nam(data, mask)
-- elsif @missval # only missing_value is present.
-- mask = (data.ne(@missval))
-- data = NArrayMiss.to_nam(data, mask)
-- end
-- data
-- end
--
-- def get_with_miss_and_scaling(*args)
-- __interpret_missing_params if !defined?(@missval)
-- data = simple_get(*args)
-- if @vmin || @vmax
-- if @vmin
-- mask = (data >= @vmin)
-- mask = mask.and(data <= @vmax) if @vmax
-- else
-- mask = (data <= @vmax)
-- end
-- data = NArrayMiss.to_nam(data, mask)
-- elsif @missval # only missing_value is present.
-- mask = (data.ne(@missval))
-- data = NArrayMiss.to_nam(data, mask)
-- end
-- data = unpack( data )
-- data
-- end
--
-- def put_with_miss(data, *args)
-- if data.is_a?( NArrayMiss )
-- __interpret_missing_params if !defined?(@missval)
-- if @missval
-- simple_put(data.to_na(@missval), *args)
-- else
-- simple_put(data.to_na, *args)
-- end
-- else
-- simple_put(data, *args)
-- end
-- end
--
-- def put_with_miss_and_scaling(data, *args)
-- if data.is_a?( NArrayMiss )
-- __interpret_missing_params if !defined?(@missval)
-- if @missval
-- data = pack( data )
-- data = data.to_na(@missval)
-- else
-- data = pack( data )
-- data = data.to_na
-- end
-- simple_put(data, *args)
-- else
-- scaled_put(data, *args)
-- end
-- end
--
-- ######### private ##########
--
-- def __interpret_missing_params
-- # Interprets the specification of missing data,
-- # either by valid_range, (valid_min and/or valid_max), or missing_value.
-- # (unlike the NetCDF User's guide (NUG), missing_value is interpreted,
-- # but valid_* has a higher precedence.)
-- # Always sets @missval whether missing_value is defined or not,
-- # since it will be used as a fill value for data missing.
-- #
-- @vmin = att('valid_min')
-- @vmin = @vmin.get if @vmin # kept in a NArray(size==1) to consv type
-- @vmax = att('valid_max')
-- @vmax = @vmax.get if @vmax # kept in a NArray(size==1) to consv type
-- vrange = att('valid_range')
-- vrange = vrange.get if vrange
-- if vrange
-- vrange.sort!
-- @vmin = vrange[0..0] # kept in... (same)
-- @vmax = vrange[-1..-1] # kept in... (same)
-- end
-- @missval = att('missing_value') || att('_FillValue')
-- @missval = @missval.get if @missval # kept in... (same)
--
-- sf = att('scale_factor')
-- ao = att('add_offset')
-- if ( sf || ao )
-- ## Both NUG & CF conventions requires to specify the valid
-- ## range with respect to the external (i.e. packed) values.
-- ## However, some conventions require specification
-- ## with respect to unpacked values. The following
-- ## is to support such cases as well:
-- thres_tp = [ self.typecode, NArray::LINT ].max
-- @missval = pack(@missval) if @missval && @missval.typecode > thres_tp
-- @vmin = pack(@vmin) if @vmin && @vmin.typecode > thres_tp
-- @vmax = pack(@vmax) if @vmax && @vmax.typecode > thres_tp
-- end
--
-- if @missval
-- if @vmin && @vmax
-- if @vmin[0] <= @missval[0] && @missval[0] <= @vmax[0]
-- warn "WARNING: missing_value #{@missval[0]} is in the valid range #{@vmin[0]}..#{@vmax[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-- end
-- else
-- if @vmin && @missval[0] >= @vmin[0]
-- warn "WARNING: missing_value #{@missval[0]} >= valid min #{@vmin[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-- elsif @vmax && @missval[0] <= @vmax[0]
-- warn "WARNING: missing_value #{@missval[0]} <= valid min #{@vmin[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-- end
-- end
-- else
-- realtc = NArray::SFLOAT
-- if @vmin
-- if @vmin[0] >= 0
-- @missval = ( @vmin.typecode>=realtc ? 0.99*@vmin : @vmin-1 )
-- else
-- @missval = ( @vmin.typecode>=realtc ? 1.01*@vmin : @vmin-1 )
-- end
-- elsif @vmax
-- if @vmax[0] >= 0
-- @missval = ( @vmax.typecode>=realtc ? 1.01*@vmax : @vmax+1 )
-- else
-- @missval = ( @vmax.typecode>=realtc ? 0.99*@vmax : @vmax+1 )
-- end
-- end
-- end
--
-- end
--
-- private :__interpret_missing_params
--
-- end
--
--end
--
--if $0 == __FILE__
-- include NumRu
--
-- filename = "tmp.nc"
-- print "creating ",filename,"...\n"
-- file=NetCDF.create(filename)
-- nx = 10
-- dimx = file.def_dim("x",nx)
-- xf = file.def_var("xf","sfloat",[dimx])
-- xfn = file.def_var("xfn","sfloat",[dimx])
-- xf.put_att("valid_range",[-1e12,1e12])
-- f = 10 ** (2*NArray.sfloat(nx).indgen!)
-- xr = file.def_var("xr","sint",[dimx])
-- xr.put_att("valid_max",[0.5])
-- xr.put_att("scale_factor",1e-4)
-- xr.put_att("add_offset",0.5)
-- xr2 = file.def_var("xr2","sint",[dimx])
-- xr2.put_att("valid_max",NArray.sint(1).fill!(1000))
-- xr2.put_att("scale_factor",1e-4)
-- xr2.put_att("add_offset",0.5)
-- r = NArray.sfloat(nx).indgen!/nx
-- file.enddef
-- xf.put(f)
-- xfn.put(f)
-- xr.scaled_put(r)
-- file.close
--
-- file = NetCDF.open(filename,'r+')
-- xf = file.var('xf')
-- xfn = file.var('xfn')
-- p "f0"
-- xf.get.each{|v| print "#{v} "} ; print "\n"
-- p( 'f1', nam = xf.get_with_miss )
-- def xf.get(*args); get_with_miss(*args); end
-- p( 'f12', xf[2..-3].to_na )
-- p( 'fn10', xfn.get_with_miss )
-- p( 'fn11', xfn.get_with_miss_and_scaling )
-- nam.invalidation([0,1])
-- p 'f2', nam
-- xf.put_with_miss(nam)
-- p( 'f3', xf.get_with_miss )
-- xr = file.var('xr')
-- p "r0"
-- xr.simple_get.each{|v| print "#{v} "} ; print "\n"
-- p( 'r1', xr.get_with_miss_and_scaling )
-- def xr.get(*args); get_with_miss_and_scaling(*args); end
-- def xr.put(*args); put_with_miss_and_scaling(*args); end
-- #xr[0..3] = xr[0..3]*10
-- p( 'r2', xr.get_with_miss_and_scaling )
-- p 'r',r
-- xr2.put_with_miss_and_scaling(r)
-- p 'xr2',xr2.get_with_miss_and_scaling
-- file.close
-- print "** ncdump tmp.nc **\n", `ncdump tmp.nc`
--end
-diff --git a/lib/numru/netcdf.rb b/lib/numru/netcdf.rb
-new file mode 100644
-index 0000000..aaba6d2
---- /dev/null
-+++ b/lib/numru/netcdf.rb
-@@ -0,0 +1,792 @@
-+require 'narray'
-+require 'numru/netcdfraw'
-+
-+# NetCDF$B%/%i%9$K4X$7$F(B
-+module NumRu
-+ class NetCDF
-+
-+ Max_Try = 100
-+
-+ def NetCDF.open(filename,mode="r",share=false)
-+ call_create=false # false-> nc_open; true->nc_create
-+ case(mode)
-+ when "r","rb" # read only
-+ mode=NC_NOWRITE
-+ when "w","w+","wb","w+b" # overwrite if exits
-+ call_create=true
-+ mode=NC_CLOBBER
-+ when "a","a+","r+","ab","a+b","r+b" # append if exits
-+ if( File.exists?(filename) )
-+ mode=NC_WRITE
-+ else
-+ call_create=true #(nonexsitent --> create)
-+ mode=NC_CLOBBER
-+ end
-+ else
-+ raise NetcdfError, "Mode #{mode} is not supported"
-+ end
-+ case(share)
-+ when false
-+ share=0
-+ when true
-+ share=NC_SHARE
-+ else
-+ raise NetcdfError, "We can't use the sharing mode you typed"
-+ end
-+ omode = mode | share
-+ if(!call_create)
-+ nc_open(filename,omode)
-+ else
-+ nc_create(filename,omode)
-+ end
-+ end
-+
-+ class << NetCDF
-+ alias new open
-+ end
-+
-+
-+ def NetCDF.create(filename,noclobber=false,share=false)
-+ case(noclobber)
-+ when false
-+ noclobber=NC_CLOBBER
-+ when true
-+ noclobber=NC_NOCLOBBER
-+ else
-+ raise NetcdfError,"noclobber (2nd argument) must be true or false"
-+ end
-+ case(share)
-+ when false
-+ share=0
-+ when true
-+ share=NC_SHARE
-+ else
-+ raise NetcdfError,"share (3rd argument) must be true or false"
-+ end
-+
-+ cmode=noclobber | share
-+ nc_create(filename,cmode)
-+ end
-+
-+ class << NetCDF
-+ def clean_tmpfile(path)
-+ proc {
-+ print "removing ", path, "..." if $DEBUG
-+ if File.exist?(path)
-+ File.unlink(path)
-+ end
-+ print "done\n" if $DEBUG
-+ }
-+ end
-+ protected :clean_tmpfile
-+ end
-+
-+ def NetCDF.create_tmp(tmpdir=ENV['TMPDIR']||ENV['TMP']||ENV['TEMP']||'.',
-+ share=false)
-+ basename = 'temp'
-+ if $SAFE > 0 and tmpdir.tainted?
-+ tmpdir = '.'
-+ end
-+
-+ n = 0
-+ while true
-+ begin
-+ tmpname = sprintf('%s/%s%d_%d.nc', tmpdir, basename, $$, n)
-+ unless File.exist?(tmpname)
-+ netcdf = NetCDF.create(tmpname, true, share)
-+ ObjectSpace.define_finalizer(netcdf,
-+ NetCDF.clean_tmpfile(tmpname))
-+ break
-+ end
-+ rescue
-+ raise NetcdfError, "cannot generate tempfile `%s'" % tmpname if n >= Max_Try
-+ end
-+ n += 1
-+ end
-+ netcdf
-+ end
-+
-+
-+ def put_att(attname,val,atttype=nil)
-+ put_attraw(attname,val,atttype)
-+ end
-+
-+ def def_var_with_dim(name, vartype, shape_ul0, dimnames)
-+ # Same as def_var but defines dimensions first if needed.
-+ # Use zero in shape to define an unlimited dimension.
-+ if (shape_ul0.length != dimnames.length ) then
-+ raise ArgumentError, 'lengths of shape and dimnames do not agree'
-+ end
-+ dims = []
-+ dimnames.each_index{ |i|
-+ dim = self.dim( dimnames[i] )
-+ if ( dim != nil ) then
-+ # dim exists --> check the length
-+ if (shape_ul0[i] != dim.length_ul0 ) then
-+ raise ArgumentError, "dimension length do not agree: #{i}th dim: "+\
-+ "#{shape_ul0[i]} and #{dim.length_ul0}"
-+ end
-+ dims.push(dim)
-+ else
-+ # dim does not exist --> define it
-+ dims.push( def_dim( dimnames[i], shape_ul0[i] ) )
-+ end
-+ }
-+ def_var(name, vartype, dims)
-+ end
-+
-+ # Iterators:
-+ def each_dim
-+ num_dim=ndims()
-+ for dimid in 0..num_dim-1
-+ obj_Dim=id2dim(dimid)
-+ yield(obj_Dim)
-+ end
-+ end
-+
-+ def each_var
-+ num_var=nvars()
-+ for varid in 0..num_var-1
-+ obj_Var=id2var(varid)
-+ yield(obj_Var)
-+ end
-+ end
-+
-+ def each_att
-+ num_att=natts()
-+ for attnum in 0..num_att-1
-+ obj_Att=id2att(attnum)
-+ yield(obj_Att)
-+ end
-+ end
-+
-+ def dims( names=nil ) # return all if names==nil
-+ if names == nil
-+ dims = (0..ndims()-1).collect{|dimid| id2dim(dimid)}
-+ else
-+ raise TypeError, "names is not an array" if ! names.is_a?(Array)
-+ dims = names.collect{|name| dim(name)}
-+ raise ArgumentError, "One or more dimensions do not exist" if dims.include?(nil)
-+ end
-+ dims
-+ end
-+
-+ def vars( names=nil ) # return all if names==nil
-+ if names == nil
-+ vars = (0..nvars()-1).collect{ |varid| id2var(varid) }
-+ else
-+ raise TypeError, "names is not an array" if ! names.is_a?(Array)
-+ vars = names.collect{|name| var(name)}
-+ raise ArgumentError, "One or more variables do not exist" if vars.include?(nil)
-+ end
-+ vars
-+ end
-+
-+ def dim_names
-+ num_dim=ndims()
-+ names=[]
-+ for dimid in 0..num_dim-1
-+ obj_Dim=id2dim(dimid)
-+ names=names+[obj_Dim.name]
-+ end
-+ return names
-+ end
-+
-+ def var_names
-+ num_var=nvars()
-+ names=[]
-+ for varid in 0..num_var-1
-+ obj_Var=id2var(varid)
-+ names=names+[obj_Var.name]
-+ end
-+ return names
-+ end
-+
-+ def att_names
-+ num_att=natts()
-+ names=[]
-+ for attnum in 0..num_att-1
-+ obj_Att=id2att(attnum)
-+ names=names+[obj_Att.name]
-+ end
-+ return names
-+ end
-+
-+ def inspect
-+ "NetCDF:"+path
-+ end
-+
-+ end
-+
-+ #NetCDFVar class $B$K4X$7$F(B
-+ class NetCDFVar
-+
-+ class << NetCDFVar
-+ def new(file,varname,mode="r",share=false)
-+ if(file.is_a?(String))
-+ file = NetCDF.open(file,mode,share)
-+ elsif(!file.is_a?(NetCDF))
-+ raise TypeError, "1st arg must be a NetCDF (file object) or a String (path)"
-+ end
-+ file.var(varname)
-+ end
-+
-+ alias open new
-+ end
-+
-+ alias :rank :ndims
-+
-+ def each_att
-+ num_att=natts()
-+ for attnum in 0..num_att-1
-+ obj_Att=id2att(attnum)
-+ yield(obj_Att)
-+ end
-+ end
-+
-+ def dim_names
-+ ary = Array.new()
-+ dims.each{|dim| ary.push(dim.name)}
-+ ary
-+ end
-+
-+ def att_names
-+ num_att=natts()
-+ names=[]
-+ for attnum in 0..num_att-1
-+ obj_Att=id2att(attnum)
-+ names=names+[obj_Att.name]
-+ end
-+ return names
-+ end
-+
-+ def put_att(attname,val,atttype=nil)
-+ put_attraw(attname,val,atttype)
-+ end
-+
-+ def shape_ul0
-+ sh = []
-+ dims.each{|d|
-+ if d.unlimited? then
-+ sh.push(0)
-+ else
-+ sh.push(d.length)
-+ end
-+ }
-+ sh
-+ end
-+
-+ def shape_current
-+ sh = []
-+ dims.each{|d|
-+ sh.push(d.length)
-+ }
-+ sh
-+ end
-+
-+ # The put and get methods in the NetCDFVar class
-+
-+ def pack(na)
-+ sf = att('scale_factor')
-+ ao = att('add_offset')
-+ if ( sf == nil && ao == nil ) then
-+ na
-+ else
-+ na = NArray.to_na(na) if na.is_a?(Array)
-+ if sf
-+ csf = sf.get
-+ raise NetcdfError,"scale_factor is not a numeric" if csf.is_a?(String)
-+ raise NetcdfError, "scale_factor is not unique" if csf.length != 1
-+ raise NetcdfError, "zero scale_factor" if csf[0] == 0
-+ else
-+ csf = nil
-+ end
-+ if ao
-+ cao = ao.get
-+ raise NetcdfError, "add_offset is not a numeric" if cao.is_a?(String)
-+ raise NetcdfError, "add_offset is not unique" if cao.length != 1
-+ else
-+ cao = nil
-+ end
-+ if csf and cao
-+ packed = (na - cao) / csf
-+ elsif csf
-+ packed = na / csf
-+ elsif cao
-+ packed = na - cao
-+ end
-+ if self.typecode <= NArray::LINT
-+ packed = packed.round
-+ end
-+ packed
-+ end
-+ end
-+
-+ def scaled_put(var,hash=nil)
-+ simple_put( pack(var), hash)
-+ end
-+
-+ @@unpack_type = nil
-+ class << NetCDFVar
-+ def unpack_type
-+ @@unpack_type
-+ end
-+ def unpack_type=(na_type)
-+ if [NArray::BYTE, NArray::SINT, NArray::INT,
-+ NArray::SFLOAT, NArray::FLOAT, nil].include?(na_type)
-+ @@unpack_type = na_type
-+ else
-+ raise ArgumentError, "Arg must be one of NArray::BYTE, NArray::SINT, NArray::INT, NArray::SFLOAT, NArray::FLOAT"
-+ end
-+ end
-+
-+ end
-+
-+ def unpack(na)
-+ sf = att('scale_factor')
-+ ao = att('add_offset')
-+ if ( sf == nil && ao == nil ) then
-+ na
-+ else
-+ if sf
-+ csf = sf.get
-+ raise NetcdfError,"scale_factor is not a numeric" if csf.is_a?(String)
-+ raise NetcdfError, "scale_factor is not unique" if csf.length != 1
-+ raise NetcdfError, "zero scale_factor" if csf[0] == 0
-+ else
-+ csf =nil
-+ end
-+ if ao
-+ cao = ao.get
-+ raise NetcdfError, "add_offset is not a numeric" if cao.is_a?(String)
-+ raise NetcdfError, "add_offset is not unique" if cao.length != 1
-+ else
-+ cao = nil
-+ end
-+ if csf and cao
-+ una = na * csf + cao # csf & cao are NArray -> coerced to their types
-+ elsif csf
-+ una = na * csf
-+ elsif cao
-+ una = na + cao
-+ end
-+ una = una.to_type(@@unpack_type) if @@unpack_type
-+ una
-+ end
-+ end
-+
-+ def scaled_get(hash=nil)
-+ unpack( simple_get(hash) )
-+ end
-+
-+ def simple_put(var,hash=nil)
-+ if hash==nil
-+ if self.vartype == "char"
-+ put_var_char(var)
-+ elsif self.vartype == "byte"
-+ put_var_byte(var)
-+ elsif self.vartype == "sint"
-+ put_var_sint(var)
-+ elsif self.vartype == "int"
-+ put_var_int(var)
-+ elsif self.vartype == "sfloat"
-+ put_var_sfloat(var)
-+ elsif self.vartype == "float"
-+ put_var_float(var)
-+ else
-+ raise NetcdfError,"variable type isn't supported in netCDF"
-+ end
-+ elsif hash.key?("index")==true
-+ if self.vartype == "char"
-+ put_var1_char(var,hash["index"])
-+ elsif self.vartype=="byte"
-+ put_var1_byte(var,hash["index"])
-+ elsif self.vartype=="sint"
-+ put_var1_sint(var,hash["index"])
-+ elsif self.vartype == "int"
-+ put_var1_int(var,hash["index"])
-+ elsif self.vartype == "sfloat"
-+ put_var1_sfloat(var,hash["index"])
-+ elsif self.vartype == "float"
-+ put_var1_float(var,hash["index"])
-+ else
-+ raise NetcdfError,"variable type isn't supported in netCDF"
-+ end
-+ elsif hash.key?("start")==true
-+ if hash.key?("end")==false && hash.key?("stride")==false
-+ if self.vartype == "char"
-+ put_vars_char(var,hash["start"],nil,nil)
-+ elsif self.vartype=="byte"
-+ put_vars_byte(var,hash["start"],nil,nil)
-+ elsif self.vartype=="sint"
-+ put_vars_sint(var,hash["start"],nil,nil)
-+ elsif self.vartype=="int"
-+ put_vars_int(var,hash["start"],nil,nil)
-+ elsif self.vartype=="sfloat"
-+ put_vars_sfloat(var,hash["start"],nil,nil)
-+ elsif self.vartype=="float"
-+ put_vars_float(var,hash["start"],nil,nil)
-+ else
-+ raise NetcdfError, "variable type isn't supported in netCDF"
-+ end
-+ elsif hash.key?("end")==true && hash.key?("stride") == false
-+ if self.vartype == "char"
-+ put_vars_char(var,hash["start"],hash["end"],nil)
-+ elsif self.vartype=="byte"
-+ put_vars_byte(var,hash["start"],hash["end"],nil)
-+ elsif self.vartype=="sint"
-+ put_vars_sint(var,hash["start"],hash["end"],nil)
-+ elsif self.vartype=="int"
-+ put_vars_int(var,hash["start"],hash["end"],nil)
-+ elsif self.vartype == "sfloat"
-+ put_vars_sfloat(var,hash["start"],hash["end"],nil)
-+ elsif self.vartype =="float"
-+ put_vars_float(var,hash["start"],hash["end"],nil)
-+ else
-+ raise NetcdfError, "variable type isn't supported in netCDF"
-+ end
-+ elsif hash.key?("end")==false && hash.key?("stride")==true
-+ if self.vartype == "char"
-+ put_vars_char(var,hash["start"],nil,hash["stride"])
-+ elsif self.vartype=="byte"
-+ put_vars_byte(var,hash["start"],nil,hash["stride"])
-+ elsif self.vartype=="sint"
-+ put_vars_sint(var,hash["start"],nil,hash["stride"])
-+ elsif self.vartype=="int"
-+ put_vars_int(var,hash["start"],nil,hash["stride"])
-+ elsif self.vartype=="sfloat"
-+ put_vars_sfloat(var,hash["start"],nil,hash["stride"])
-+ elsif self.vartype=="float"
-+ put_vars_float(var,hash["start"],nil,hash["stride"])
-+ else
-+ raise NetcdfError, "variable type isn't supported in netCDF"
-+ end
-+ else hash.key?("end")==true && hash.key?("stride")==true
-+ if self.vartype == "char"
-+ put_vars_char(var,hash["start"],hash["end"],hash["stride"])
-+ elsif self.vartype=="byte"
-+ put_vars_byte(var,hash["start"],hash["end"],hash["stride"])
-+ elsif self.vartype=="sint"
-+ put_vars_sint(var,hash["start"],hash["end"],hash["stride"])
-+ elsif self.vartype=="int"
-+ put_vars_int(var,hash["start"],hash["end"],hash["stride"])
-+ elsif self.vartype=="sfloat"
-+ put_vars_sfloat(var,hash["start"],hash["end"],hash["stride"])
-+ elsif self.vartype=="float"
-+ put_vars_float(var,hash["start"],hash["end"],hash["stride"])
-+ else
-+ raise NetcdfError, "variable type isn't supported in netCDF"
-+ end
-+ end
-+ else
-+ raise ArgumentError,"{'start'}=>[ARRAY] or {'index'}=>[ARRAY] is needed"
-+ end
-+ end
-+
-+ alias put simple_put
-+
-+ def simple_get(hash=nil)
-+ t_var = self.vartype
-+ if hash == nil
-+ if t_var == "char"
-+ get_var_char
-+ elsif t_var == "byte"
-+ get_var_byte
-+ elsif t_var == "sint"
-+ get_var_sint
-+ elsif t_var == "int"
-+ get_var_int
-+ elsif t_var == "sfloat"
-+ get_var_sfloat
-+ elsif t_var == "float"
-+ get_var_float
-+ else
-+ raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-+ end
-+ elsif hash.key?("index")==true
-+ ind = hash["index"]
-+ if t_var == "char"
-+ get_var1_char(ind)
-+ elsif t_var == "byte"
-+ get_var1_byte(ind)
-+ elsif t_var == "sint"
-+ get_var1_sint(ind)
-+ elsif t_var == "int"
-+ get_var1_int(ind)
-+ elsif t_var == "sfloat"
-+ get_var1_sfloat(ind)
-+ elsif t_var == "float"
-+ get_var1_float(ind)
-+ else
-+ raise NetcdfError,"variable type #{t_var} isn't supported in netCDF"
-+ end
-+ elsif hash.key?("start")==true
-+ h_sta = hash["start"]
-+ endq = hash.key?("end")
-+ strq = hash.key?("stride")
-+ if endq == false && strq == false
-+ if t_var == "char"
-+ get_vars_char(h_sta,nil,nil)
-+ elsif t_var == "byte"
-+ get_vars_byte(h_sta,nil,nil)
-+ elsif t_var == "sint"
-+ get_vars_sint(h_sta,nil,nil)
-+ elsif t_var == "int"
-+ get_vars_int(h_sta,nil,nil)
-+ elsif t_var == "sfloat"
-+ get_vars_sfloat(h_sta,nil,nil)
-+ elsif t_var == "float"
-+ get_vars_float(h_sta,nil,nil)
-+ else
-+ raise NetcdfError, "varialbe type #{t_var} isn't supported in netCDF"
-+ end
-+ elsif endq == true && strq == false
-+ h_end = hash["end"]
-+ if t_var == "char"
-+ get_vars_char(h_sta,h_end,nil)
-+ elsif t_var == "byte"
-+ get_vars_byte(h_sta,h_end,nil)
-+ elsif t_var == "sint"
-+ get_vars_sint(h_sta,h_end,nil)
-+ elsif t_var == "int"
-+ get_vars_int(h_sta,h_end,nil)
-+ elsif t_var == "sfloat"
-+ get_vars_sfloat(h_sta,h_end,nil)
-+ elsif t_var == "float"
-+ get_vars_float(h_sta,h_end,nil)
-+ else
-+ raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-+ end
-+ elsif endq == false && strq == true
-+ h_str = hash["stride"]
-+ if t_var == "char"
-+ get_vars_char(h_sta,nil,h_str)
-+ elsif t_var == "byte"
-+ get_vars_byte(h_sta,nil,h_str)
-+ elsif t_var == "sint"
-+ get_vars_sint(h_sta,nil,h_str)
-+ elsif t_var == "int"
-+ get_vars_int(h_sta,nil,h_str)
-+ elsif t_var == "sfloat"
-+ get_vars_sfloat(h_sta,nil,h_str)
-+ elsif t_var == "float"
-+ get_vars_float(h_sta,nil,h_str)
-+ else
-+ raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-+ end
-+ else endq == true && strq == true
-+ h_end = hash["end"]
-+ h_str = hash["stride"]
-+ if t_var == "char"
-+ get_vars_char(h_sta,h_end,h_str)
-+ elsif t_var == "byte"
-+ get_vars_byte(h_sta,h_end,h_str)
-+ elsif t_var == "sint"
-+ get_vars_sint(h_sta,h_end,h_str)
-+ elsif t_var == "int"
-+ get_vars_int(h_sta,h_end,h_str)
-+ elsif t_var == "sfloat"
-+ get_vars_sfloat(h_sta,h_end,h_str)
-+ elsif t_var == "float"
-+ get_vars_float(h_sta,h_end,h_str)
-+ else
-+ raise NetcdfError, "variable type #{t_var} isn't supported in netCDF"
-+ end
-+ end
-+ else
-+ raise ArgumentError,"{'start'}=>{ARRAY} or {'index'}=>{ARRAY} is needed"
-+ end
-+ end
-+
-+ alias get simple_get
-+
-+ def __rubber_expansion( args )
-+ if (id = args.index(false)) # substitution into id
-+ # false is incuded
-+ alen = args.length
-+ if args.rindex(false) != id
-+ raise ArguemntError,"only one rubber dimension is permitted"
-+ elsif alen > rank+1
-+ raise ArgumentError, "too many args"
-+ end
-+ ar = ( id!=0 ? args[0..id-1] : [] )
-+ args = ar + [true]*(rank-alen+1) + args[id+1..-1]
-+ elsif args.length == 0 # to support empty [], []=
-+ args = [true]*rank
-+ end
-+ args
-+ end
-+ private :__rubber_expansion
-+
-+ def [](*a)
-+ if a.length == 0
-+ return self.get
-+ end
-+ a = __rubber_expansion(a)
-+ first = Array.new
-+ last = Array.new
-+ stride = Array.new
-+ set_stride = false
-+ a.each{|i|
-+ if(i.is_a?(Fixnum))
-+ first.push(i)
-+ last.push(i)
-+ stride.push(1)
-+ elsif(i.is_a?(Range))
-+ first.push(i.first)
-+ last.push(i.exclude_end? ? i.last-1 : i.last)
-+ stride.push(1)
-+ elsif(i.is_a?(Hash))
-+ r = (i.to_a[0])[0]
-+ s = (i.to_a[0])[1]
-+ if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
-+ raise TypeError, "Hash argument must be {a_Range, step}"
-+ end
-+ first.push(r.first)
-+ last.push(r.exclude_end? ? r.last-1 : r.last)
-+ stride.push(s)
-+ set_stride = true
-+ elsif(i.is_a?(TrueClass))
-+ first.push(0)
-+ last.push(-1)
-+ stride.push(1)
-+ elsif( i.is_a?(Array) || i.is_a?(NArray))
-+ a_new = a.dup
-+ at = a.index(i)
-+ i = NArray.to_na(i) if i.is_a?(Array)
-+ for n in 0..i.length-1
-+ a_new[at] = i[n]..i[n]
-+ na_tmp = self[*a_new]
-+ if n==0 then
-+ k = at
-+ if at > 0
-+ a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
-+ end
-+ shape_tmp = na_tmp.shape
-+ shape_tmp[k] = i.length
-+ na = na_tmp.class.new(na_tmp.typecode,*shape_tmp)
-+ index_tmp = Array.new(shape_tmp.length,true)
-+ end
-+ index_tmp[k] = n..n
-+ na[*index_tmp] = na_tmp
-+ end
-+ return na
-+ else
-+ raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
-+ end
-+ }
-+
-+ if(set_stride)
-+ na = self.get({"start"=>first, "end"=>last, "stride"=>stride})
-+ else
-+ na = self.get({"start"=>first, "end"=>last})
-+ end
-+ shape = na.shape
-+ (a.length-1).downto(0){ |i|
-+ shape.delete_at(i) if a[i].is_a?(Fixnum)
-+ }
-+ na.reshape!( *shape )
-+ na
-+ end
-+
-+ def []=(*a)
-+ val = a.pop
-+ a = __rubber_expansion(a)
-+ first = Array.new
-+ last = Array.new
-+ stride = Array.new
-+ set_stride = false
-+ a.each{|i|
-+ if(i.is_a?(Fixnum))
-+ first.push(i)
-+ last.push(i)
-+ stride.push(1)
-+ elsif(i.is_a?(Range))
-+ first.push(i.first)
-+ last.push(i.exclude_end? ? i.last-1 : i.last)
-+ stride.push(1)
-+ elsif(i.is_a?(Hash))
-+ r = (i.to_a[0])[0]
-+ s = (i.to_a[0])[1]
-+ if ( !( r.is_a?(Range) ) || ! ( s.is_a?(Integer) ) )
-+ raise ArgumentError, "Hash argument must be {first..last, step}"
-+ end
-+ first.push(r.first)
-+ last.push(r.exclude_end? ? r.last-1 : r.last)
-+ stride.push(s)
-+ set_stride = true
-+ elsif(i.is_a?(TrueClass))
-+ first.push(0)
-+ last.push(-1)
-+ stride.push(1)
-+ elsif(i.is_a?(Array) || i.is_a?(NArray))
-+ a_new = a.dup
-+ at = a.index(i)
-+ i = NArray.to_na(i) if i.is_a?(Array)
-+ val = NArray.to_na(val) if val.is_a?(Array)
-+ rank_of_subset = a.dup.delete_if{|v| v.is_a?(Fixnum)}.length
-+ if val.rank != rank_of_subset
-+ raise "rank of the rhs (#{val.rank}) is not equal to the rank "+
-+ "of the subset specified by #{a.inspect} (#{rank_of_subset})"
-+ end
-+ k = at
-+ a[0..at-1].each{|x| if x.is_a?(Fixnum) then k -= 1 end}
-+ if i.length != val.shape[k]
-+ raise "length of the #{k+1}-th dim of rhs is incorrect "+
-+ "(#{i.length} for #{val.shape[k]})"
-+ end
-+ index_tmp = Array.new(val.rank,true) if !val.is_a?(Numeric) #==>Array-like
-+ for n in 0..i.length-1
-+ a_new[at] = i[n]..i[n]
-+ if !val.is_a?(Numeric) then
-+ index_tmp[k] = n..n
-+ self[*a_new] = val[*index_tmp]
-+ else
-+ self[*a_new] = val
-+ end
-+ end
-+ return self
-+ else
-+ raise TypeError, "argument must be Fixnum, Range, Hash, TrueClass, Array, or NArray"
-+ end
-+ }
-+
-+ if(set_stride)
-+ self.put(val, {"start"=>first, "end"=>last, "stride"=>stride})
-+ else
-+ self.put(val, {"start"=>first, "end"=>last})
-+ end
-+ end
-+
-+ def inspect
-+ 'NetCDFVar:'+file.path+'?var='+name
-+ end
-+
-+ end
-+
-+ class NetCDFAtt
-+
-+ def put(val,atttype=nil)
-+ putraw(val,atttype)
-+ end
-+
-+ def inspect
-+ 'NetCDFAtt:'+name
-+ end
-+ end
-+
-+ class NetCDFDim
-+ def inspect
-+ 'NetCDFDim:'+name
-+ end
-+
-+ def length_ul0
-+ if unlimited?
-+ 0
-+ else
-+ length
-+ end
-+ end
-+
-+ end
-+end
-diff --git a/lib/numru/netcdf_miss.rb b/lib/numru/netcdf_miss.rb
-new file mode 100644
-index 0000000..4b168f0
---- /dev/null
-+++ b/lib/numru/netcdf_miss.rb
-@@ -0,0 +1,203 @@
-+require "numru/netcdf"
-+require "narray_miss"
-+
-+module NumRu
-+
-+ class NetCDFVar
-+
-+ def get_with_miss(*args)
-+ __interpret_missing_params if !defined?(@missval)
-+ data = simple_get(*args)
-+ if @vmin || @vmax
-+ if @vmin
-+ mask = (data >= @vmin)
-+ mask = mask.and(data <= @vmax) if @vmax
-+ else
-+ mask = (data <= @vmax)
-+ end
-+ data = NArrayMiss.to_nam(data, mask)
-+ elsif @missval # only missing_value is present.
-+ mask = (data.ne(@missval))
-+ data = NArrayMiss.to_nam(data, mask)
-+ end
-+ data
-+ end
-+
-+ def get_with_miss_and_scaling(*args)
-+ __interpret_missing_params if !defined?(@missval)
-+ data = simple_get(*args)
-+ if @vmin || @vmax
-+ if @vmin
-+ mask = (data >= @vmin)
-+ mask = mask.and(data <= @vmax) if @vmax
-+ else
-+ mask = (data <= @vmax)
-+ end
-+ data = NArrayMiss.to_nam(data, mask)
-+ elsif @missval # only missing_value is present.
-+ mask = (data.ne(@missval))
-+ data = NArrayMiss.to_nam(data, mask)
-+ end
-+ data = unpack( data )
-+ data
-+ end
-+
-+ def put_with_miss(data, *args)
-+ if data.is_a?( NArrayMiss )
-+ __interpret_missing_params if !defined?(@missval)
-+ if @missval
-+ simple_put(data.to_na(@missval), *args)
-+ else
-+ simple_put(data.to_na, *args)
-+ end
-+ else
-+ simple_put(data, *args)
-+ end
-+ end
-+
-+ def put_with_miss_and_scaling(data, *args)
-+ if data.is_a?( NArrayMiss )
-+ __interpret_missing_params if !defined?(@missval)
-+ if @missval
-+ data = pack( data )
-+ data = data.to_na(@missval)
-+ else
-+ data = pack( data )
-+ data = data.to_na
-+ end
-+ simple_put(data, *args)
-+ else
-+ scaled_put(data, *args)
-+ end
-+ end
-+
-+ ######### private ##########
-+
-+ def __interpret_missing_params
-+ # Interprets the specification of missing data,
-+ # either by valid_range, (valid_min and/or valid_max), or missing_value.
-+ # (unlike the NetCDF User's guide (NUG), missing_value is interpreted,
-+ # but valid_* has a higher precedence.)
-+ # Always sets @missval whether missing_value is defined or not,
-+ # since it will be used as a fill value for data missing.
-+ #
-+ @vmin = att('valid_min')
-+ @vmin = @vmin.get if @vmin # kept in a NArray(size==1) to consv type
-+ @vmax = att('valid_max')
-+ @vmax = @vmax.get if @vmax # kept in a NArray(size==1) to consv type
-+ vrange = att('valid_range')
-+ vrange = vrange.get if vrange
-+ if vrange
-+ vrange.sort!
-+ @vmin = vrange[0..0] # kept in... (same)
-+ @vmax = vrange[-1..-1] # kept in... (same)
-+ end
-+ @missval = att('missing_value') || att('_FillValue')
-+ @missval = @missval.get if @missval # kept in... (same)
-+
-+ sf = att('scale_factor')
-+ ao = att('add_offset')
-+ if ( sf || ao )
-+ ## Both NUG & CF conventions requires to specify the valid
-+ ## range with respect to the external (i.e. packed) values.
-+ ## However, some conventions require specification
-+ ## with respect to unpacked values. The following
-+ ## is to support such cases as well:
-+ thres_tp = [ self.typecode, NArray::LINT ].max
-+ @missval = pack(@missval) if @missval && @missval.typecode > thres_tp
-+ @vmin = pack(@vmin) if @vmin && @vmin.typecode > thres_tp
-+ @vmax = pack(@vmax) if @vmax && @vmax.typecode > thres_tp
-+ end
-+
-+ if @missval
-+ if @vmin && @vmax
-+ if @vmin[0] <= @missval[0] && @missval[0] <= @vmax[0]
-+ warn "WARNING: missing_value #{@missval[0]} is in the valid range #{@vmin[0]}..#{@vmax[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-+ end
-+ else
-+ if @vmin && @missval[0] >= @vmin[0]
-+ warn "WARNING: missing_value #{@missval[0]} >= valid min #{@vmin[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-+ elsif @vmax && @missval[0] <= @vmax[0]
-+ warn "WARNING: missing_value #{@missval[0]} <= valid min #{@vmin[0]} --> will be ignored (#{__FILE__}:#{__LINE__})"
-+ end
-+ end
-+ else
-+ realtc = NArray::SFLOAT
-+ if @vmin
-+ if @vmin[0] >= 0
-+ @missval = ( @vmin.typecode>=realtc ? 0.99*@vmin : @vmin-1 )
-+ else
-+ @missval = ( @vmin.typecode>=realtc ? 1.01*@vmin : @vmin-1 )
-+ end
-+ elsif @vmax
-+ if @vmax[0] >= 0
-+ @missval = ( @vmax.typecode>=realtc ? 1.01*@vmax : @vmax+1 )
-+ else
-+ @missval = ( @vmax.typecode>=realtc ? 0.99*@vmax : @vmax+1 )
-+ end
-+ end
-+ end
-+
-+ end
-+
-+ private :__interpret_missing_params
-+
-+ end
-+
-+end
-+
-+if $0 == __FILE__
-+ include NumRu
-+
-+ filename = "tmp.nc"
-+ print "creating ",filename,"...\n"
-+ file=NetCDF.create(filename)
-+ nx = 10
-+ dimx = file.def_dim("x",nx)
-+ xf = file.def_var("xf","sfloat",[dimx])
-+ xfn = file.def_var("xfn","sfloat",[dimx])
-+ xf.put_att("valid_range",[-1e12,1e12])
-+ f = 10 ** (2*NArray.sfloat(nx).indgen!)
-+ xr = file.def_var("xr","sint",[dimx])
-+ xr.put_att("valid_max",[0.5])
-+ xr.put_att("scale_factor",1e-4)
-+ xr.put_att("add_offset",0.5)
-+ xr2 = file.def_var("xr2","sint",[dimx])
-+ xr2.put_att("valid_max",NArray.sint(1).fill!(1000))
-+ xr2.put_att("scale_factor",1e-4)
-+ xr2.put_att("add_offset",0.5)
-+ r = NArray.sfloat(nx).indgen!/nx
-+ file.enddef
-+ xf.put(f)
-+ xfn.put(f)
-+ xr.scaled_put(r)
-+ file.close
-+
-+ file = NetCDF.open(filename,'r+')
-+ xf = file.var('xf')
-+ xfn = file.var('xfn')
-+ p "f0"
-+ xf.get.each{|v| print "#{v} "} ; print "\n"
-+ p( 'f1', nam = xf.get_with_miss )
-+ def xf.get(*args); get_with_miss(*args); end
-+ p( 'f12', xf[2..-3].to_na )
-+ p( 'fn10', xfn.get_with_miss )
-+ p( 'fn11', xfn.get_with_miss_and_scaling )
-+ nam.invalidation([0,1])
-+ p 'f2', nam
-+ xf.put_with_miss(nam)
-+ p( 'f3', xf.get_with_miss )
-+ xr = file.var('xr')
-+ p "r0"
-+ xr.simple_get.each{|v| print "#{v} "} ; print "\n"
-+ p( 'r1', xr.get_with_miss_and_scaling )
-+ def xr.get(*args); get_with_miss_and_scaling(*args); end
-+ def xr.put(*args); put_with_miss_and_scaling(*args); end
-+ #xr[0..3] = xr[0..3]*10
-+ p( 'r2', xr.get_with_miss_and_scaling )
-+ p 'r',r
-+ xr2.put_with_miss_and_scaling(r)
-+ p 'xr2',xr2.get_with_miss_and_scaling
-+ file.close
-+ print "** ncdump tmp.nc **\n", `ncdump tmp.nc`
-+end
-diff --git a/netcdfraw.c b/netcdfraw.c
-deleted file mode 100644
-index 9922d19..0000000
---- a/netcdfraw.c
-+++ /dev/null
-@@ -1,4614 +0,0 @@
--#include<stdio.h>
--#include "ruby.h"
--#include "narray.h"
--#include<netcdf.h>
--#include<string.h>
--
--/* for compatibility with ruby 1.6 */
--#ifndef RSTRING_PTR
--#define RSTRING_PTR(s) (RSTRING(s)->ptr)
--#endif
--#ifndef RSTRING_LEN
--#define RSTRING_LEN(s) (RSTRING(s)->len)
--#endif
--#ifndef RARRAY_PTR
--#define RARRAY_PTR(a) (RARRAY(a)->ptr)
--#endif
--#ifndef RARRAY_LEN
--#define RARRAY_LEN(a) (RARRAY(a)->len)
--#endif
--#ifndef StringValueCStr
--#define StringValueCStr(s) STR2CSTR(s)
--#endif
--#ifndef SafeStringValue
--#define SafeStringValue(s) Check_SafeStr(s)
--#endif
--
--/* Data to NArray */
--
--/* memcpy(ary->ptr,nc_ptr,na_sizeof[NA_SINT]*ary->total); \ */
--
--#define Cbyte_to_NArray(v, rank, shape, up) \
--{ \
-- struct NARRAY *ary; \
-- v = na_make_object(NA_BYTE, rank, shape, cNArray); \
-- GetNArray(v,ary); \
-- up = (unsigned char *)ary->ptr; \
--}
--
--#define Csint_to_NArray(v, rank, shape, sp) \
--{ \
-- struct NARRAY *ary; \
-- v = na_make_object(NA_SINT, rank, shape, cNArray); \
-- GetNArray(v, ary); \
-- sp = (short *)ary->ptr; \
--}
--
--#define Clint_to_NArray(v, rank, shape, lp) \
--{ \
-- struct NARRAY *ary; \
-- v = na_make_object(NA_LINT, rank, shape, cNArray); \
-- GetNArray(v, ary); \
-- lp = (int *)ary->ptr; \
--}
--#define Cfloat_to_NArray(v, rank, shape, fp) \
--{ \
-- struct NARRAY *ary; \
-- v = na_make_object(NA_SFLOAT, rank, shape, cNArray); \
-- GetNArray(v, ary); \
-- fp = (float *)ary->ptr; \
--}
--#define Cdouble_to_NArray(v, rank, shape, dp); \
--{ \
-- struct NARRAY *ary; \
-- v = na_make_object(NA_DFLOAT, rank, shape, cNArray); \
-- GetNArray(v, ary); \
-- dp = (double *)ary->ptr; \
--}
--
--/* Array or NArray to pointer and length (with no new allocation) */
--
--#define Array_to_Cfloat_len(obj, ptr, len) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (float *) NA_PTR(na,0); \
-- len = na->total; \
--}
--
--#define Array_to_Cfloat_len_shape(obj, ptr, len, shape) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (float *) NA_PTR(na,0); \
-- len = na->total; \
-- shape = na->shape; \
--}
--
--#define Array_to_Cdouble_len(obj, ptr, len) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_DFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (double *) NA_PTR(na,0); \
-- len = na->total; \
--}
--#define Array_to_Cdouble_len_shape(obj, ptr, len, shape) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_DFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (double *) NA_PTR(na,0); \
-- len = na->total; \
-- shape = na->shape; \
--}
--
--#define Array_to_Cbyte_len(obj, ptr, len) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_BYTE); \
-- GetNArray(obj, na); \
-- ptr = (u_int8_t *) NA_PTR(na,0); \
-- len = na->total; \
--}
--
--#define Array_to_Cbyte_len_shape(obj, ptr, len, shape) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_BYTE); \
-- GetNArray(obj, na); \
-- ptr = (u_int8_t *) NA_PTR(na,0); \
-- len = na->total; \
-- shape = na->shape; \
--}
--
--#define Array_to_Csint_len(obj, ptr, len) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SINT); \
-- GetNArray(obj, na); \
-- ptr = (int16_t *) NA_PTR(na,0); \
-- len = na->total; \
--}
--
--#define Array_to_Csint_len_shape(obj, ptr, len, shape) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SINT); \
-- GetNArray(obj, na); \
-- ptr = (int16_t *) NA_PTR(na,0); \
-- len = na->total; \
-- shape = na->shape; \
--}
--
--
--#define Array_to_Clint_len(obj, ptr, len) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_LINT); \
-- GetNArray(obj, na); \
-- ptr = (int32_t *) NA_PTR(na,0); \
-- len = na->total; \
--}
--
--#define Array_to_Clint_len_shape(obj, ptr, len, shape) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_LINT); \
-- GetNArray(obj, na); \
-- ptr = (int32_t *) NA_PTR(na,0); \
-- len = na->total; \
-- shape = na->shape; \
--}
--
--
--/* Array or NArray to pointer (with no new allocation) */
--
--#define Array_to_Cfloat(obj, ptr) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (float *) NA_PTR(na,0); \
--}
--#define Array_to_Cdouble(obj, ptr) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_DFLOAT); \
-- GetNArray(obj, na); \
-- ptr = (double *) NA_PTR(na,0); \
--}
--#define Array_to_Cbyte(obj, ptr) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_BYTE); \
-- GetNArray(obj, na); \
-- ptr = (u_int8_t *) NA_PTR(na,0); \
--}
--#define Array_to_Csint(obj, ptr) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_SINT); \
-- GetNArray(obj, na); \
-- ptr = (int16_t *) NA_PTR(na,0); \
--}
--#define Array_to_Clint(obj, ptr) \
--{ \
-- struct NARRAY *na; \
-- obj = na_cast_object(obj, NA_LINT); \
-- GetNArray(obj, na); \
-- ptr = (int32_t *) NA_PTR(na,0); \
--}
--
--#define NC_RAISE(status) rb_raise(err_status2class(status),(nc_strerror(status)))
--#define NC_RAISE2(status, str) rb_raise(err_status2class(status),"%s (%s)",nc_strerror(status),(str) )
--
--static VALUE mNumRu = 0;
--static VALUE cNetCDF;
--static VALUE cNetCDFDim;
--static VALUE cNetCDFAtt;
--static VALUE cNetCDFVar;
--
--static VALUE rb_eNetcdfError;
--static VALUE rb_eNetcdfBadid;
--static VALUE rb_eNetcdfNfile;
--static VALUE rb_eNetcdfExist;
--static VALUE rb_eNetcdfInval;
--static VALUE rb_eNetcdfPerm;
--static VALUE rb_eNetcdfNotindefine;
--static VALUE rb_eNetcdfIndefine;
--static VALUE rb_eNetcdfInvalcoords;
--static VALUE rb_eNetcdfMaxdims;
--static VALUE rb_eNetcdfNameinuse;
--static VALUE rb_eNetcdfNotatt;
--static VALUE rb_eNetcdfMaxatts;
--static VALUE rb_eNetcdfBadtype;
--static VALUE rb_eNetcdfBaddim;
--static VALUE rb_eNetcdfUnlimpos;
--static VALUE rb_eNetcdfMaxvars;
--static VALUE rb_eNetcdfNotvar;
--static VALUE rb_eNetcdfGlobal;
--static VALUE rb_eNetcdfNotnc;
--static VALUE rb_eNetcdfSts;
--static VALUE rb_eNetcdfMaxname;
--static VALUE rb_eNetcdfUnlimit;
--static VALUE rb_eNetcdfNorecvars;
--static VALUE rb_eNetcdfChar;
--static VALUE rb_eNetcdfEdge;
--static VALUE rb_eNetcdfStride;
--static VALUE rb_eNetcdfBadname;
--static VALUE rb_eNetcdfRange;
--static VALUE rb_eNetcdfNomem;
--
--/* Special Error */
--/* Global error status */
--
--static VALUE rb_eNetcdfFatal;
--
--/* Global options variable. Used to determine behavior of error handler. */
--
--static VALUE rb_eNetcdfEntool;
--static VALUE rb_eNetcdfExdr;
--static VALUE rb_eNetcdfSyserr;
--
--
--struct Netcdf{
-- int ncid;
-- char *name;
-- int closed;
--};
--
--struct NetCDFDim{
-- int dimid;
-- int ncid;
--};
--
--struct NetCDFVar{
-- int varid;
-- int ncid;
-- VALUE file;
--};
--
--struct NetCDFAtt{
-- int varid;
-- int ncid;
-- char *name;
--};
--
--static struct Netcdf *
--NetCDF_init(int ncid,char *filename)
--{
-- struct Netcdf *Netcdffile;
-- Netcdffile=xmalloc(sizeof(struct Netcdf));
-- Netcdffile->ncid=ncid;
-- Netcdffile->closed=0;
-- Netcdffile->name=xmalloc((strlen(filename)+1)*sizeof(char));
-- strcpy(Netcdffile->name,filename);
-- return(Netcdffile);
--}
--
--static struct NetCDFDim *
--NetCDF_dim_init(int ncid,int dimid)
--{
-- struct NetCDFDim *Netcdf_dim;
-- Netcdf_dim=xmalloc(sizeof(struct NetCDFDim));
-- Netcdf_dim->dimid=dimid;
-- Netcdf_dim->ncid=ncid;
-- return(Netcdf_dim);
--}
--
--static struct NetCDFVar *
--NetCDF_var_init(int ncid,int varid,VALUE file)
--{
-- struct NetCDFVar *Netcdf_var;
-- Netcdf_var=xmalloc(sizeof(struct NetCDFVar));
-- Netcdf_var->varid=varid;
-- Netcdf_var->ncid=ncid;
-- Netcdf_var->file=file;
-- return(Netcdf_var);
--}
--static struct NetCDFAtt *
--NetCDF_att_init(int ncid,int varid,char *attname)
--{
-- struct NetCDFAtt *Netcdf_att;
-- Netcdf_att=xmalloc(sizeof(struct NetCDFAtt));
-- Netcdf_att->ncid=ncid;
-- Netcdf_att->varid=varid;
-- Netcdf_att->name=xmalloc((strlen(attname)+1)*sizeof(char));
-- strcpy(Netcdf_att->name,attname);
-- return(Netcdf_att);
--}
--
--void
--Netcdf_att_free(struct NetCDFAtt *Netcdf_att)
--{
-- free(Netcdf_att->name);
-- free(Netcdf_att);
--}
--
--void
--NetCDF_var_free(struct NetCDFVar *Netcdf_var)
--{
-- free(Netcdf_var);
--}
--
--void
--NetCDF_dim_free(struct NetCDFDim *Netcdf_dim)
--{
-- free(Netcdf_dim);
--}
--
--void
--NetCDF_free(struct Netcdf *Netcdffile)
--{
-- int status;
-- if (!Netcdffile->closed){
-- status = nc_close(Netcdffile->ncid); /* no error check -- not to stop during GC */
-- }
-- free(Netcdffile->name);
-- free(Netcdffile);
--}
--
--static VALUE
--err_status2class(int status)
--{
-- if(NC_ISSYSERR(status)){
-- return(rb_eNetcdfSyserr);
-- }
-- switch(status)
-- {
-- case(NC_EBADID):
-- return(rb_eNetcdfBadid);break;
-- case(NC_ENFILE):
-- return(rb_eNetcdfNfile);break;
-- case(NC_EEXIST):
-- return(rb_eNetcdfExist);break;
-- case(NC_EINVAL):
-- return(rb_eNetcdfInval);break;
-- case(NC_EPERM):
-- return(rb_eNetcdfPerm);break;
-- case(NC_ENOTINDEFINE):
-- return(rb_eNetcdfNotindefine);break;
-- case(NC_EINDEFINE):
-- return(rb_eNetcdfIndefine);break;
-- case(NC_EINVALCOORDS):
-- return(rb_eNetcdfInvalcoords);break;
-- case(NC_EMAXDIMS):
-- return(rb_eNetcdfMaxdims);break;
-- case(NC_ENAMEINUSE):
-- return(rb_eNetcdfNameinuse);break;
-- case(NC_ENOTATT):
-- return(rb_eNetcdfNotatt);break;
-- case(NC_EMAXATTS):
-- return(rb_eNetcdfMaxatts);break;
-- case(NC_EBADTYPE):
-- return(rb_eNetcdfBadtype);break;
-- case(NC_EBADDIM):
-- return(rb_eNetcdfBaddim);break;
-- case(NC_EUNLIMPOS):
-- return(rb_eNetcdfUnlimpos);break;
-- case(NC_EMAXVARS):
-- return(rb_eNetcdfMaxvars);break;
-- case(NC_ENOTVAR):
-- return(rb_eNetcdfNotvar);break;
-- case(NC_EGLOBAL):
-- return(rb_eNetcdfGlobal);break;
-- case(NC_ENOTNC):
-- return(rb_eNetcdfNotnc);break;
-- case(NC_ESTS):
-- return(rb_eNetcdfSts);break;
-- case(NC_EMAXNAME):
-- return(rb_eNetcdfMaxname);break;
-- case(NC_EUNLIMIT):
-- return(rb_eNetcdfUnlimit);break;
-- case(NC_ENORECVARS):
-- return(rb_eNetcdfNorecvars);break;
-- case(NC_ECHAR):
-- return(rb_eNetcdfChar);break;
-- case(NC_EEDGE):
-- return(rb_eNetcdfEdge);break;
-- case(NC_ESTRIDE):
-- return(rb_eNetcdfStride);break;
-- case(NC_EBADNAME):
-- return(rb_eNetcdfBadname);break;
-- case(NC_ERANGE):
-- return(rb_eNetcdfRange);break;
-- case(NC_ENOMEM):
-- return(rb_eNetcdfNomem);break;
-- /* case(NC_ENTOOL):
-- return(rb_eNetcdfEntool);break; */
-- case(NC_EXDR):
-- return(rb_eNetcdfExdr);break;
-- case(NC_SYSERR):
-- return(rb_eNetcdfSyserr);break;
-- case(NC_FATAL):
-- return(rb_eNetcdfFatal);break;
-- }
--}
--
--static const char*
--nctype2natype(int nctype){
-- switch(nctype){
-- case NC_CHAR:
-- return("char");
-- case NC_BYTE:
-- return("byte");
-- case NC_SHORT:
-- return("sint");
-- case NC_INT:
-- return("int");
-- case NC_FLOAT:
-- return("sfloat");
-- case NC_DOUBLE:
-- return("float");
-- default:
-- rb_raise(rb_eNetcdfError, "No such netcdf type number %d\n",nctype);
-- }
--}
--
--static int
--nctype2natypecode(int nctype){
-- switch(nctype){
-- case NC_CHAR:
-- return(NA_BYTE);
-- case NC_BYTE:
-- return(NA_BYTE);
-- case NC_SHORT:
-- return(NA_SINT);
-- case NC_INT:
-- return(NA_LINT);
-- case NC_FLOAT:
-- return(NA_SFLOAT);
-- case NC_DOUBLE:
-- return(NA_DFLOAT);
-- default:
-- rb_raise(rb_eNetcdfError, "No such netcdf type number %d\n",nctype);
-- }
--}
--
--static int
--natype2nctype(char *natype)
--{
-- if(strcmp(natype,"byte")==0) return(NC_BYTE);
-- else if(strcmp(natype,"char")==0) return(NC_CHAR);
-- else if(strcmp(natype,"text")==0) return(NC_CHAR); /* alias of char */
-- else if(strcmp(natype,"string")==0) return(NC_CHAR); /* alias of char */
-- else if(strcmp(natype,"sint")==0) return(NC_SHORT);
-- else if(strcmp(natype,"int")==0) return(NC_INT);
-- else if(strcmp(natype,"sfloat")==0) return(NC_FLOAT);
-- else if(strcmp(natype,"float")==0) return(NC_DOUBLE);
-- else rb_raise(rb_eNetcdfError, "No such NArray type '%s'",natype);
--}
--
--static int
--natypecode2nctype(int natypecode)
--{
-- if(natypecode==NA_BYTE) return(NC_BYTE);
-- else if(natypecode==NA_SINT) return(NC_SHORT);
-- else if(natypecode==NA_LINT) return(NC_INT);
-- else if(natypecode==NA_SFLOAT) return(NC_FLOAT);
-- else if(natypecode==NA_DFLOAT) return(NC_DOUBLE);
-- else rb_raise(rb_eNetcdfError, "No such NArray typecode '%d'",natypecode);
--}
--
--static void
--nc_mark_obj(struct NetCDFVar *netcdf_var)
--{
-- VALUE ptr;
--
-- ptr = netcdf_var->file;
-- rb_gc_mark(ptr);
--}
--
--
--VALUE
--NetCDF_clone(VALUE file)
--{
-- VALUE clone;
-- struct Netcdf *nc1, *nc2;
--
-- Data_Get_Struct(file, struct Netcdf, nc1);
-- nc2 = NetCDF_init(nc1->ncid, nc1->name);
-- clone = Data_Wrap_Struct(cNetCDF, 0, NetCDF_free, nc2);
-- CLONESETUP(clone, file);
-- return clone;
--}
--
--VALUE
--NetCDF_dim_clone(VALUE dim)
--{
-- VALUE clone;
-- struct NetCDFDim *nd1, *nd2;
--
-- Data_Get_Struct(dim, struct NetCDFDim, nd1);
-- nd2 = NetCDF_dim_init(nd1->ncid, nd1->dimid);
-- clone = Data_Wrap_Struct(cNetCDFDim, 0, NetCDF_dim_free, nd2);
-- CLONESETUP(clone, dim);
-- return clone;
--}
--
--VALUE
--NetCDF_att_clone(VALUE att)
--{
-- VALUE clone;
-- struct NetCDFAtt *na1, *na2;
--
-- Data_Get_Struct(att, struct NetCDFAtt, na1);
-- na2 = NetCDF_att_init(na1->ncid, na1->varid, na1->name);
-- clone = Data_Wrap_Struct(cNetCDFAtt, 0, Netcdf_att_free, na2);
-- CLONESETUP(clone, att);
-- return clone;
--}
--
--VALUE
--NetCDF_var_clone(VALUE var)
--{
-- VALUE clone;
-- struct NetCDFVar *nv1, *nv2;
--
-- Data_Get_Struct(var, struct NetCDFVar, nv1);
-- nv2 = NetCDF_var_init(nv1->ncid, nv1->varid, nv1->file);
-- clone = Data_Wrap_Struct(cNetCDFVar, nc_mark_obj, NetCDF_var_free, nv2);
-- CLONESETUP(clone, var);
-- return clone;
--}
--
--VALUE
--NetCDF_close(file)
-- VALUE file;
--{
-- int status;
-- int ncid;
-- struct Netcdf *Netcdffile;
--
-- if (rb_safe_level() >= 4 && !OBJ_TAINTED(file)) {
-- rb_raise(rb_eSecurityError, "Insecure: can't close");
-- }
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- if(!Netcdffile->closed){
-- status = nc_close(ncid);
-- if(status != NC_NOERR) NC_RAISE(status);
-- Netcdffile->closed = 1;
-- } else {
-- rb_warn("file %s is already closed", Netcdffile->name);
-- }
-- return Qnil;
--}
--
--VALUE
--NetCDF_def_dim(VALUE file,VALUE dim_name,VALUE length)
--{
-- char* c_dim_name;
-- size_t c_length;
-- int ncid;
-- int dimidp;
-- int status;
-- struct Netcdf *Netcdffile;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dimension;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
--
-- Check_Type(dim_name,T_STRING);
-- c_dim_name=RSTRING_PTR(dim_name);
-- c_length=NUM2UINT(length);
-- ncid=Netcdffile->ncid;
--
-- status = nc_def_dim(ncid,c_dim_name,c_length,&dimidp);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- Netcdf_dim = NetCDF_dim_init(ncid,dimidp);
--
-- Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-- return Dimension;
--}
--
--
--static VALUE
--NetCDF_put_att_char(int ncid, char *name,VALUE value,VALUE atttype, int varid)
--{
-- int status;
-- struct NetCDFAtt *ncatt;
--
-- /* check atttype (not necessarily needed but it's better to do it) */
-- if (TYPE(atttype) == T_STRING){
-- if ( natype2nctype(RSTRING_PTR(atttype)) != NC_CHAR ) {
-- rb_raise(rb_eNetcdfError,
-- "attribute type must be 'char' (or nil) for a String value");
-- }
-- } else if (TYPE(atttype) != T_NIL) {
-- rb_raise(rb_eNetcdfError,
-- "type specfication must be by a string or nil");
-- }
-- /* put value */
-- Check_Type(value,T_STRING);
-- status = nc_put_att_text(ncid, varid, name,
-- RSTRING_LEN(value), RSTRING_PTR(value));
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- ncatt = NetCDF_att_init(ncid,varid,name);
-- return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,ncatt));
--}
--
--static VALUE
--NetCDF_put_att_numeric(int ncid, char *name,VALUE value,VALUE atttype, int varid)
--{
-- VALUE val;
-- struct NARRAY *na_val;
-- int na_typecode, status, len;
-- char *ptr;
-- struct NetCDFAtt *ncatt;
--
-- /* check atttype and cast to an appropriate NArray if needed */
--
-- if (TYPE(atttype) != T_NIL){
-- na_typecode = na_get_typecode(atttype);
-- GetNArray( na_cast_object(value, na_typecode), na_val );
-- } else {
-- if (TYPE(value)==T_ARRAY) {
-- val = RARRAY_PTR(value)[0]; /* to check the 1st elemnt if Array */
-- } else {
-- val = value;
-- }
-- switch(TYPE(val)){
-- case T_FIXNUM:
-- case T_BIGNUM:
-- na_typecode = NA_LINT;
-- GetNArray( na_cast_object(value, na_typecode), na_val );
-- break;
-- case T_FLOAT:
-- na_typecode = NA_DFLOAT;
-- GetNArray( na_cast_object(value, na_typecode), na_val );
-- break;
-- case T_DATA:
-- if ( IsNArray(value) ){
-- GetNArray(value,na_val);
-- na_typecode = na_val->type;
-- } else {
-- rb_raise(rb_eNetcdfError,"value has a wrong data type");
-- }
-- break;
-- default:
-- rb_raise(rb_eNetcdfError,
-- "value (or its first element) has a wrong type");
-- }
-- }
--
-- /* put value */
--
-- len = na_val->total;
-- ptr = na_val->ptr;
-- switch(na_typecode){
-- case NA_BYTE:
-- status = nc_put_att_uchar(ncid,varid,name,NC_BYTE,len,(unsigned char *)ptr);
-- break;
-- case NA_SINT:
-- status = nc_put_att_short(ncid,varid,name,NC_SHORT,len,(short *)ptr);
-- break;
-- case NA_LINT:
-- status = nc_put_att_int(ncid,varid,name,NC_INT,len,(int *)ptr);
-- break;
-- case NA_SFLOAT:
-- status = nc_put_att_float(ncid,varid,name,NC_FLOAT,len,(float *)ptr);
-- break;
-- case NA_DFLOAT:
-- status = nc_put_att_double(ncid,varid,name,NC_DOUBLE,len,(double*)ptr);
-- break;
-- default:
-- rb_raise(rb_eNetcdfError,
-- "unsupported type. code = %d",na_typecode);
-- }
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- ncatt = NetCDF_att_init(ncid,varid,name);
-- return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,ncatt));
--}
--
--static VALUE
--NetCDF_put_att__(int ncid, char *name, VALUE value, VALUE atttype, int varid)
-- /*
-- * atttype: nil or a String ("string","int",etc). If nil,
-- * the type of attribute is determined from the type of value
-- */
--{
-- switch(TYPE(value)){
-- case T_STRING:
-- return(NetCDF_put_att_char(ncid, name, value, atttype, varid));
-- default:
-- return(NetCDF_put_att_numeric(ncid, name, value, atttype, varid));
-- }
--}
--
--VALUE
--NetCDF_put_att(VALUE file,VALUE att_name,VALUE value,VALUE atttype)
-- /*
-- * atttype: nil or a String ("string","int",etc). If nil,
-- * the type of attribute is determined from the type of value
-- */
--{
-- struct Netcdf *ncfile;
-- char *name;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- Check_Type(att_name,T_STRING);
-- name = RSTRING_PTR(att_name);
--
-- return( NetCDF_put_att__(ncfile->ncid, name, value, atttype, NC_GLOBAL) );
--}
--
--VALUE
--NetCDF_put_att_var(VALUE var,VALUE att_name,VALUE value,VALUE atttype)
-- /*
-- * atttype: nil or a String ("string","int",etc). If nil,
-- * the type of attribute is determined from the type of value
-- */
--{
-- struct NetCDFVar *ncvar;
-- char *name;
--
-- rb_secure(4);
-- Data_Get_Struct(var,struct NetCDFVar,ncvar);
-- Check_Type(att_name,T_STRING);
-- name = RSTRING_PTR(att_name);
--
-- return( NetCDF_put_att__(ncvar->ncid, name, value, atttype, ncvar->varid));
--}
--
--
--VALUE
--NetCDF_def_var(VALUE file,VALUE var_name,VALUE vartype,VALUE dimensions)
--{
-- int ncid;
-- char *c_var_name;
-- static int xtype;
-- long c_ndims;
-- int varidp;
-- int dimidp;
-- int i=0;
-- int status;
-- char *c_dim_name;
-- int c_dimids[NC_MAX_DIMS];
-- struct Netcdf *Netcdffile;
-- struct NetCDFVar *Netcdf_var;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Var;
--
-- rb_secure(4);
-- Check_Type(var_name,T_STRING);
-- Check_Type(dimensions,T_ARRAY);
--
-- c_var_name=RSTRING_PTR(var_name);
-- c_ndims=RARRAY_LEN(dimensions);
--
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
--
-- if (TYPE(vartype) == T_STRING){
-- xtype = natype2nctype(RSTRING_PTR(vartype));
-- } else if (TYPE(vartype) == T_FIXNUM){
-- xtype = natypecode2nctype(NUM2INT(vartype));
-- } else {
-- rb_raise(rb_eNetcdfError,
-- "type specfication must be by a string or nil");
-- }
--
-- for(i=0;i<c_ndims;i++){
-- switch(TYPE(RARRAY_PTR(dimensions)[c_ndims-1-i])){
-- case T_STRING:
-- Check_Type(RARRAY_PTR(dimensions)[c_ndims-1-i],T_STRING);
-- c_dim_name=StringValueCStr(RARRAY_PTR(dimensions)[c_ndims-1-i]);
-- status=nc_inq_dimid(ncid,c_dim_name,&dimidp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- c_dimids[i]=dimidp;
-- break;
-- case T_DATA:
-- Data_Get_Struct(RARRAY_PTR(dimensions)[c_ndims-1-i],struct NetCDFDim,Netcdf_dim);
-- c_dimids[i]=Netcdf_dim->dimid;
-- break;
-- default:
-- rb_raise(rb_eNetcdfError, "No such object of the netCDF dimension class.");
-- }
-- }
--
-- status = nc_def_var(ncid,c_var_name,xtype,c_ndims,c_dimids,&varidp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Netcdf_var = NetCDF_var_init(ncid,varidp,file);
--
-- Var=Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-- return Var;
--}
--
--
--VALUE
--NetCDF_dim(VALUE file,VALUE dim_name)
--{
-- int ncid;
-- char *c_dim_name;
-- int dimidp;
-- int status;
-- struct Netcdf *Netcdffile;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dimension;
--
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- Check_Type(dim_name,T_STRING);
-- c_dim_name=RSTRING_PTR(dim_name);
--
-- status = nc_inq_dimid(ncid,c_dim_name,&dimidp);
-- if(status !=NC_NOERR){
-- if(status == NC_EBADDIM){
-- return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
-- } else{
-- NC_RAISE(status);
-- }
-- }
--
-- Netcdf_dim=NetCDF_dim_init(ncid,dimidp);
--
-- Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-- return Dimension;
--}
--
--VALUE
--NetCDF_var(VALUE file,VALUE var_name)
--{
-- int ncid;
-- int status;
-- int varidp;
-- char *c_var_name;
-- struct Netcdf *Netcdffile;
-- struct NetCDFVar *Netcdf_var;
-- VALUE Variable;
--
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- Check_Type(var_name,T_STRING);
-- c_var_name=RSTRING_PTR(var_name);
--
-- status=nc_inq_varid(ncid,c_var_name,&varidp);
-- if(status != NC_NOERR){
-- if(status == NC_ENOTVAR){
-- return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
-- } else{
-- NC_RAISE(status);
-- }
-- }
--
-- Netcdf_var = NetCDF_var_init(ncid,varidp,file);
-- Variable = Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-- return Variable;
--}
--
--VALUE
--NetCDF_att(VALUE file,VALUE att_name)
--{
-- int ncid;
-- int status;
-- int attnump;
-- char *c_att_name;
-- struct Netcdf *Netcdffile;
-- struct NetCDFAtt *Netcdf_att;
-- VALUE Attribute;
--
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- Check_Type(att_name,T_STRING);
-- c_att_name=RSTRING_PTR(att_name);
--
--
-- status = nc_inq_attid(ncid,NC_GLOBAL,c_att_name,&attnump);
-- if(status != NC_NOERR){
-- if(status == NC_ENOTATT){
-- return(Qnil);
-- }
-- else{
-- NC_RAISE(status);
-- }
-- }
--
-- Netcdf_att = NetCDF_att_init(ncid,NC_GLOBAL,c_att_name);
--
-- Attribute = Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
--
-- return Attribute;
--}
--VALUE
--NetCDF_fill(VALUE file,VALUE mode)
--{
-- int ncid;
-- int status;
-- struct Netcdf *Netcdffile;
-- int old_modep;
--
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid = Netcdffile->ncid;
-- if(mode==Qfalse){
-- status = nc_set_fill(ncid,NC_NOFILL,&old_modep);
-- if(status != NC_NOERR) NC_RAISE(status);
-- }
-- else if(mode == Qtrue){
-- status = nc_set_fill(ncid,NC_FILL,&old_modep);
-- if(status != NC_NOERR) NC_RAISE(status);
-- }
-- else
-- rb_raise(rb_eNetcdfError,"Usage:self.fill(true) or self.fill(false)");
-- return Qnil;
--}
--
--VALUE
--NetCDF_redef(VALUE file)
--{
-- int ncid;
-- int status;
-- struct Netcdf *Netcdffile;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- status = nc_redef(ncid);
-- if(status !=NC_NOERR){
-- if(status == NC_EINDEFINE){
-- return Qnil;
-- }
-- else{
-- NC_RAISE(status);
-- }
-- }
-- return Qtrue;
--}
--
--VALUE
--NetCDF_enddef(VALUE file)
--{
-- int ncid;
-- int status;
-- struct Netcdf *Netcdffile;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- status = nc_enddef(ncid);
-- if(status !=NC_NOERR){
-- if(status == NC_ENOTINDEFINE){
-- return Qnil;
-- }
-- else{
-- NC_RAISE(status);
-- }
-- }
-- return Qtrue;
--}
--
--VALUE
--NetCDF_whether_in_define_mode(VALUE file)
--{
-- /* returns true if the NetCDF object is currently in the define mode,
-- false if in the data mode, and
-- nil if else (possibly the file is read-only, or some other
-- error occurred)
-- */
-- int ncid;
-- int status;
-- struct Netcdf *Netcdffile;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,Netcdffile);
-- ncid=Netcdffile->ncid;
-- status = nc_redef(ncid);
-- if(status == NC_EINDEFINE){
-- return Qtrue;
-- } else if(status == NC_NOERR) {
-- /* was in the data mode --> recover the data mode and report false */
-- status = nc_enddef(ncid);
-- if(status == NC_NOERR) {
-- return Qfalse;
-- } else {
-- return Qnil;
-- }
-- } else {
-- return Qnil;
-- }
--}
--
--VALUE
--NetCDF_open(VALUE mod,VALUE filename,VALUE omode)
--{
-- int status;
-- int ncid;
-- char* c_filename;
-- int c_omode;
-- struct Netcdf *ncfile;
-- VALUE retval;
--
-- Check_Type(filename,T_STRING);
-- SafeStringValue(filename);
-- c_filename=RSTRING_PTR(filename);
-- Check_Type(omode,T_FIXNUM);
-- c_omode=NUM2INT(omode);
--
-- status = nc_open(c_filename,c_omode,&ncid);
-- if(status !=NC_NOERR){NC_RAISE2(status,c_filename);}
--
-- ncfile = NetCDF_init(ncid,c_filename);
-- retval = Data_Wrap_Struct(cNetCDF,0,NetCDF_free,ncfile);
-- return( retval );
--}
--
--VALUE
--NetCDF_create(VALUE mod,VALUE filename,VALUE cmode)
--{
-- int ncid;
-- int status;
-- char* c_filename;
-- int c_cmode;
-- struct Netcdf *ncfile;
--
-- Check_Type(filename,T_STRING);
-- SafeStringValue(filename);
-- c_filename=RSTRING_PTR(filename);
-- Check_Type(cmode,T_FIXNUM);
-- c_cmode=NUM2INT(cmode);
--
-- status = nc_create(c_filename,c_cmode,&ncid);
-- if(status != NC_NOERR) NC_RAISE2(status, c_filename);
--
-- ncfile = NetCDF_init(ncid,c_filename);
-- return( Data_Wrap_Struct(cNetCDF,0,NetCDF_free,ncfile) );
--}
--
--VALUE
--NetCDF_ndims(VALUE file)
--{
-- int ncid;
-- int ndimsp;
-- VALUE Integer;
-- int status;
-- struct Netcdf *ncfile;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- status = nc_inq_ndims(ncid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE (status);
-- Integer = INT2NUM(ndimsp);
-- return Integer;
--}
--
--VALUE
--NetCDF_nvars(VALUE file)
--{
-- int ncid;
-- int nvarsp;
-- int status;
-- VALUE Integer;
-- struct Netcdf *ncfile;
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- status = nc_inq_nvars(ncid,&nvarsp);
-- if(status != NC_NOERR) NC_RAISE (status);
-- Integer = INT2NUM(nvarsp);
-- return Integer;
--}
--
--VALUE
--NetCDF_natts(VALUE file)
--{
-- int ncid;
-- int nattsp;
-- int status;
-- VALUE Integer;
-- struct Netcdf *ncfile;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- status=nc_inq_natts(ncid,&nattsp);
-- if(status != NC_NOERR) NC_RAISE (status);
-- Integer = INT2NUM(nattsp);
-- return Integer;
--}
--
--VALUE
--NetCDF_unlimited(VALUE file)
--{
-- int ncid;
-- int unlimdimidp;
-- int status;
-- struct Netcdf *ncfile;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dimension;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- status=nc_inq_unlimdim(ncid,&unlimdimidp);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- Netcdf_dim = NetCDF_dim_init(ncid,unlimdimidp);
--
-- /* If unlimdimidp=-1,No unlimited dimension is defined in the netCDF dataset */
-- if(unlimdimidp != -1)
-- {
-- Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-- return Dimension;
-- }
-- else
-- {
-- return Qnil;
-- }
--}
--
--VALUE
--NetCDF_sync(VALUE file)
--{
-- int ncid;
-- int status;
-- struct Netcdf *ncfile;
--
-- rb_secure(4);
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- status = nc_sync(ncid);
-- if(status !=NC_NOERR) NC_RAISE (status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_path(VALUE file)
--{
-- char *path;
-- struct Netcdf *ncfile;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- path=ncfile->name;
-- return(rb_str_new2(path));
--}
--
--VALUE
--NetCDF_dim_length(VALUE Dim)
--{
-- int ncid;
-- int status;
-- int dimid;
-- size_t lengthp;
-- struct NetCDFDim *Netcdf_dim;
--
-- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-- ncid=Netcdf_dim->ncid;
-- dimid=Netcdf_dim->dimid;
--
-- status = nc_inq_dimlen(ncid,dimid,&lengthp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- return(INT2NUM(lengthp));
--}
--
--VALUE
--NetCDF_dim_name(VALUE Dim,VALUE dimension_newname)
--{
-- int ncid;
-- int status;
-- int dimid;
-- char *c_dim_name;
-- struct NetCDFDim *Netcdf_dim;
--
-- rb_secure(4);
-- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-- ncid=Netcdf_dim->ncid;
-- dimid=Netcdf_dim->dimid;
-- Check_Type(dimension_newname,T_STRING);
-- c_dim_name = StringValueCStr(dimension_newname);
--
-- status = nc_rename_dim(ncid,dimid,c_dim_name);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- return Qnil;
--}
--
--VALUE
--NetCDF_dim_inqname(VALUE Dim)
--{
-- int ncid;
-- int status;
-- int dimid;
-- char c_dim_name[NC_MAX_NAME];
-- struct NetCDFDim *Netcdf_dim;
-- VALUE str;
--
-- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-- ncid=Netcdf_dim->ncid;
-- dimid=Netcdf_dim->dimid;
--
-- status = nc_inq_dimname(ncid,dimid,c_dim_name);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- str = rb_str_new2(c_dim_name);
-- OBJ_TAINT(str);
-- return(str);
--}
--
--VALUE
--NetCDF_dim_whether_unlimited(VALUE Dim)
--{
-- int status;
-- int uldid;
-- struct NetCDFDim *Netcdf_dim;
--
-- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
-- status=nc_inq_unlimdim(Netcdf_dim->ncid,&uldid);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- if(Netcdf_dim->dimid == uldid){
-- return(Qtrue);
-- } else {
-- return(Qfalse);
-- }
--}
--
--VALUE
--NetCDF_att_inq_name(VALUE Att)
--{
-- char *c_att_name;
-- struct NetCDFAtt *Netcdf_att;
-- VALUE str;
--
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- c_att_name=Netcdf_att->name;
--
-- str = rb_str_new2(c_att_name);
-- OBJ_TAINT(str);
-- return(str);
--}
--
--VALUE
--NetCDF_att_rename(VALUE Att,VALUE new_att_name)
--{
-- int ncid;
-- int status;
-- int varid;
-- char *c_att_name;
-- char *c_new_att_name;
-- struct NetCDFAtt *Netcdf_att;
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- ncid=Netcdf_att->ncid;
-- varid=Netcdf_att->varid;
--
-- c_att_name=Netcdf_att->name;
--
-- Check_Type(new_att_name,T_STRING);
-- SafeStringValue(new_att_name);
-- c_new_att_name=StringValueCStr(new_att_name);
--
-- status = nc_rename_att(ncid,varid,c_att_name,c_new_att_name);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- strcpy(Netcdf_att->name,c_new_att_name);
-- return Qnil;
--}
--
--VALUE
--NetCDF_id2dim(VALUE file,VALUE dimid)
--{
-- int ncid;
-- int c_dimid;
-- struct Netcdf *ncfile;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dim;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- Check_Type(dimid,T_FIXNUM);
-- c_dimid=NUM2INT(dimid);
-- Netcdf_dim = NetCDF_dim_init(ncid,c_dimid);
-- Dim=Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-- return(Dim);
--}
--
--VALUE
--NetCDF_id2var(VALUE file,VALUE varid)
--{
-- int ncid;
-- int c_varid;
-- struct Netcdf *ncfile;
-- struct NetCDFVar *Netcdf_var;
-- VALUE Var;
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
-- Check_Type(varid,T_FIXNUM);
-- c_varid=NUM2INT(varid);
-- Netcdf_var = NetCDF_var_init(ncid,c_varid,file);
-- Var=Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
-- return(Var);
--}
--
--
--VALUE
--NetCDF_id2att(VALUE file,VALUE attnum)
--{
-- int ncid;
-- int c_attnum;
-- int status;
-- struct Netcdf *ncfile;
-- struct NetCDFAtt *Netcdf_att;
-- char *c_att_name;
-- VALUE Att;
-- c_att_name=ALLOCA_N(char,NC_MAX_NAME);
--
-- Data_Get_Struct(file,struct Netcdf,ncfile);
-- ncid=ncfile->ncid;
--
-- Check_Type(attnum,T_FIXNUM);
-- c_attnum=NUM2INT(attnum);
--
-- status = nc_inq_attname(ncid,NC_GLOBAL,c_attnum,c_att_name);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Netcdf_att=NetCDF_att_init(ncid,NC_GLOBAL,c_att_name);
--
-- Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-- return(Att);
--
--}
--
--VALUE
--NetCDF_var_id2att(VALUE Var,VALUE attnum)
--{
-- int ncid;
-- int c_attnum;
-- int status;
-- int c_varid;
-- struct NetCDFVar *Netcdf_var;
-- struct NetCDFAtt *Netcdf_att;
-- char *c_att_name;
-- VALUE Att;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- c_varid=Netcdf_var->varid;
--
-- Check_Type(attnum,T_FIXNUM);
-- c_attnum=NUM2INT(attnum);
--
-- c_att_name=ALLOCA_N(char,NC_MAX_NAME);
--
-- status = nc_inq_attname(ncid,c_varid,c_attnum,c_att_name);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Netcdf_att=NetCDF_att_init(ncid,c_varid,c_att_name);
-- Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-- return(Att);
--}
--
--VALUE
--NetCDF_var_dims(VALUE Var)
--{
-- int ncid, *dimids, ndims, varid, i, status;
-- struct NetCDFVar *Netcdf_var;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dims;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- Dims = rb_ary_new();
-- for(i=0;i<ndims;i++){
-- Netcdf_dim = NetCDF_dim_init(ncid,dimids[ndims-1-i]);
-- rb_ary_push(Dims,
-- Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim));
-- }
-- return(Dims);
--}
--
--VALUE
--NetCDF_var_dim(VALUE Var, VALUE ith)
--{
-- int ncid, *dimids, ndims, varid, status, c_ith;
-- struct NetCDFVar *Netcdf_var;
-- struct NetCDFDim *Netcdf_dim;
-- VALUE Dim;
--
-- Check_Type(ith,T_FIXNUM);
-- c_ith=NUM2INT(ith);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(c_ith < 0 || c_ith >= ndims) {
-- rb_raise(rb_eNetcdfError, "dimension count less than zero or greater than ndims-1");
-- }
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- Netcdf_dim = NetCDF_dim_init(ncid,dimids[ndims-1-c_ith]);
-- Dim = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-- return(Dim);
--}
--
--VALUE
--NetCDF_att_copy(VALUE Att,VALUE Var_or_File)
--{
-- int ncid_in,ncid_out;
-- int status;
-- int varid_in,varid_out;
-- char *att_name;
-- struct NetCDFAtt *Netcdf_att;
-- struct NetCDFVar *Netcdf_var;
-- struct Netcdf *ncfile;
-- struct NetCDFAtt *Netcdf_att_out;
--
-- rb_secure(4);
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- ncid_in=Netcdf_att->ncid;
-- varid_in=Netcdf_att->varid;
-- att_name=Netcdf_att->name;
--
-- if( rb_obj_is_kind_of(Var_or_File, cNetCDFVar) ){
-- Data_Get_Struct(Var_or_File,struct NetCDFVar, Netcdf_var);
-- ncid_out=Netcdf_var->ncid;
-- varid_out=Netcdf_var->varid;
-- } else if ( rb_obj_is_kind_of(Var_or_File, cNetCDF) ){
-- Data_Get_Struct(Var_or_File,struct Netcdf, ncfile);
-- ncid_out=ncfile->ncid;
-- varid_out=NC_GLOBAL;
-- } else {
-- rb_raise(rb_eNetcdfError,"The argument must be a NetCDFVar or a NetCDF");
-- }
--
-- status = nc_copy_att(ncid_in,varid_in,att_name,ncid_out,varid_out);
-- if(status != NC_NOERR) NC_RAISE(status);
-- Netcdf_att_out = NetCDF_att_init(ncid_out,varid_out,att_name);
-- return (Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att_out));
--}
--
--VALUE
--NetCDF_att_atttype(VALUE Att)
--{
-- int ncid;
-- int varid;
-- int status;
-- char *att_name;
-- const char *Attname;
-- struct NetCDFAtt *Netcdf_att;
-- nc_type xtypep;
--
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- ncid = Netcdf_att->ncid;
-- varid = Netcdf_att->varid;
-- att_name = Netcdf_att->name;
--
-- status = nc_inq_atttype(ncid,varid,att_name,&xtypep);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Attname = nctype2natype(xtypep);
-- return(rb_str_new2(Attname));
--}
--
--VALUE
--NetCDF_att_typecode(VALUE Att)
--{
-- int ncid;
-- int varid;
-- int status;
-- char *att_name;
-- struct NetCDFAtt *Netcdf_att;
-- nc_type xtypep;
--
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- ncid = Netcdf_att->ncid;
-- varid = Netcdf_att->varid;
-- att_name = Netcdf_att->name;
--
-- status = nc_inq_atttype(ncid,varid,att_name,&xtypep);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- return(INT2NUM(nctype2natypecode(xtypep)));
--}
--
--VALUE
--NetCDF_att_delete(VALUE Att)
--{
-- int ncid;
-- int status;
-- int varid;
-- char *c_att_name;
-- struct NetCDFAtt *Netcdf_att;
--
-- rb_secure(4);
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
--
-- ncid=Netcdf_att->ncid;
-- varid=Netcdf_att->varid;
-- c_att_name=Netcdf_att->name;
--
-- status = nc_del_att(ncid,varid,c_att_name);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- return Qnil;
--}
--
--VALUE
--NetCDF_att_put(VALUE Att,VALUE value,VALUE atttype)
-- /*
-- * atttype: nil or a String ("string","int",etc). If nil,
-- * the type of attribute is determined from the type of value
-- */
--{
-- struct NetCDFAtt *ncatt;
--
-- rb_secure(4);
-- Data_Get_Struct(Att,struct NetCDFAtt,ncatt);
-- return( NetCDF_put_att__(ncatt->ncid, ncatt->name, value,
-- atttype, ncatt->varid) );
--}
--
--VALUE
--NetCDF_att_get(VALUE Att)
--{
-- int ncid;
-- int varid;
-- char *c_attname;
-- int status;
-- struct NetCDFAtt *Netcdf_att;
-- nc_type xtypep;
-- size_t lenp;
-- int attlen[1]; /* NArray uses int instead of size_t */
-- char *tp;
-- unsigned char *up;
-- short *sp;
-- int *ip;
-- float *fp;
-- double *dp;
-- VALUE NArray;
-- VALUE str;
--
-- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
-- ncid = Netcdf_att->ncid;
-- varid = Netcdf_att->varid;
-- c_attname = Netcdf_att->name;
--
-- status = nc_inq_atttype(ncid,varid,c_attname,&xtypep);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- switch(xtypep){
-- case NC_CHAR:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- tp = ALLOCA_N(char,lenp+1);
-- tp[lenp]= '\0';
-- status = nc_get_att_text(ncid,varid,c_attname,tp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- str = rb_str_new2(tp);
-- OBJ_TAINT(str);
-- return(str);
-- break;
-- case NC_BYTE:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- attlen[0]=lenp;
-- Cbyte_to_NArray(NArray,1,attlen,up);
--
-- status = nc_get_att_uchar(ncid,varid,c_attname,up);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
-- break;
-- case NC_SHORT:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- attlen[0]=lenp;
-- Csint_to_NArray(NArray,1,attlen,sp);
--
-- status = nc_get_att_short(ncid,varid,c_attname,sp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- OBJ_TAINT(NArray);
-- return NArray;
-- break;
-- case NC_INT:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- attlen[0]=lenp;
-- Clint_to_NArray(NArray,1,attlen,ip);
--
-- status = nc_get_att_int(ncid,varid,c_attname,ip);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
-- break;
-- case NC_FLOAT:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- attlen[0]=lenp;
-- Cfloat_to_NArray(NArray,1,attlen,fp);
--
-- status = nc_get_att_float(ncid,varid,c_attname,fp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
-- break;
-- case NC_DOUBLE:
-- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- attlen[0]=lenp;
-- Cdouble_to_NArray(NArray,1,attlen,dp);
--
-- status = nc_get_att_double(ncid,varid,c_attname,dp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- OBJ_TAINT(NArray);
-- return NArray;
-- break;
-- default:
-- rb_raise(rb_eNetcdfError,"atttype isn't supported in netCDF");
-- }
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_var_inq_name(VALUE Var)
--{
-- int ncid;
-- int status;
-- int varid;
-- char c_var_name[NC_MAX_NAME];
-- struct NetCDFVar *Netcdf_var;
-- VALUE Var_name;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varname(ncid,varid,c_var_name);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Var_name=rb_str_new2(c_var_name);
-- OBJ_TAINT(Var_name);
-- return Var_name;
--}
--
--VALUE
--NetCDF_var_ndims(VALUE Var)
--{
-- int ncid;
-- int status;
-- int varid;
-- int ndimsp;
-- struct NetCDFVar *Netcdf_var;
-- VALUE Var_ndims;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- Var_ndims=INT2FIX(ndimsp);
-- return Var_ndims;
--}
--
--VALUE
--NetCDF_var_vartype(VALUE Var)
--{
-- int ncid;
-- int status;
-- int varid;
-- nc_type xtypep;
-- struct NetCDFVar *Netcdf_var;
-- const char *Vartype;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- status = nc_inq_vartype(ncid,varid,&xtypep);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Vartype=nctype2natype(xtypep);
-- return(rb_str_new2(Vartype));
--}
--
--VALUE
--NetCDF_var_typecode(VALUE Var)
--{
-- int ncid;
-- int status;
-- int varid;
-- nc_type xtypep;
-- struct NetCDFVar *Netcdf_var;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- status = nc_inq_vartype(ncid,varid,&xtypep);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- return(INT2NUM(nctype2natypecode(xtypep)));
--}
--
--
--VALUE
--NetCDF_var_natts(VALUE Var)
--{
-- int ncid;
-- int status;
-- int varid;
-- int nattsp;
-- struct NetCDFVar *Netcdf_var;
-- VALUE Var_natts;
--
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- status= nc_inq_varnatts(ncid,varid,&nattsp);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- Var_natts=INT2FIX(nattsp);
-- return Var_natts;
--}
--
--VALUE
--NetCDF_var_file(VALUE Var)
--{
-- struct NetCDFVar *Netcdf_var;
-- /* VALUE file; */
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- return (Netcdf_var->file);
--}
--
--VALUE
--NetCDF_var_rename(VALUE Var,VALUE var_new_name)
--{
-- int ncid;
-- int status;
-- int varid;
-- char *c_var_new_name;
-- struct NetCDFVar *Netcdf_var;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Check_Type(var_new_name,T_STRING);
-- c_var_new_name=StringValueCStr(var_new_name);
--
-- status = nc_rename_var(ncid,varid,c_var_new_name);
-- if(status !=NC_NOERR) NC_RAISE(status);
--
-- return Qnil;
--}
--
--VALUE
--NetCDF_var_att(VALUE Var,VALUE att_name)
--{
-- int ncid;
-- int status;
-- int varid;
-- char *c_att_name;
-- int c_attnump;
-- struct NetCDFVar *Netcdf_var;
-- struct NetCDFAtt *Netcdf_att;
-- VALUE Att;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Check_Type(att_name,T_STRING);
-- c_att_name=StringValueCStr(att_name);
--
-- status = nc_inq_attid(ncid,varid,c_att_name,&c_attnump);
-- if(status == NC_NOERR){
-- Netcdf_att=NetCDF_att_init(ncid,varid,c_att_name);
-- Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
-- return Att;
-- }
-- else if(status == NC_ENOTATT){
-- return Qnil;
-- }
-- else{
-- NC_RAISE(status);
-- return Qnil;
-- }
--}
--
--/* Redifinition of the "==" and "eql?" methods */
--
--VALUE
--NetCDF_eql(VALUE filea,VALUE fileb)
--{
-- struct Netcdf *ncfilea;
-- struct Netcdf *ncfileb;
--
-- if( rb_obj_is_kind_of(fileb, cNetCDF) ){
-- Data_Get_Struct(filea,struct Netcdf,ncfilea);
-- Data_Get_Struct(fileb,struct Netcdf,ncfileb);
--
-- if(ncfilea->ncid == ncfileb->ncid &&
-- strcmp(ncfilea->name,ncfileb->name)==0){
-- return Qtrue;
-- } else {
-- return Qfalse;
-- }
-- } else {
-- return Qfalse;
-- }
--}
--
--VALUE
--NetCDF_var_eql(VALUE Vara,VALUE Varb)
--{
-- struct NetCDFVar *Netcdf_vara;
-- struct NetCDFVar *Netcdf_varb;
--
-- if( rb_obj_is_kind_of(Varb, cNetCDFVar) ){
-- Data_Get_Struct(Vara,struct NetCDFVar,Netcdf_vara);
-- Data_Get_Struct(Varb,struct NetCDFVar,Netcdf_varb);
--
-- if(Netcdf_vara->ncid == Netcdf_varb->ncid &&
-- Netcdf_vara->varid == Netcdf_varb->varid){
-- return Qtrue;
-- } else {
-- return Qfalse;
-- }
-- } else {
-- return Qfalse;
-- }
--}
--
--VALUE
--NetCDF_dim_eql(VALUE Dima,VALUE Dimb)
--{
-- struct NetCDFDim *Netcdf_dima;
-- struct NetCDFDim *Netcdf_dimb;
--
-- if( rb_obj_is_kind_of(Dimb, cNetCDFDim) ){
-- Data_Get_Struct(Dima,struct NetCDFDim,Netcdf_dima);
-- Data_Get_Struct(Dimb,struct NetCDFDim,Netcdf_dimb);
--
-- if(Netcdf_dima->ncid == Netcdf_dimb->ncid &&
-- Netcdf_dima->dimid == Netcdf_dimb->dimid){
-- return Qtrue;
-- } else {
-- return Qfalse;
-- }
-- } else {
-- return Qfalse;
-- }
--}
--
--VALUE
--NetCDF_att_eql(VALUE Atta,VALUE Attb)
--{
-- struct NetCDFAtt *Netcdf_atta;
-- struct NetCDFAtt *Netcdf_attb;
--
-- if( rb_obj_is_kind_of(Attb, cNetCDFAtt) ){
-- Data_Get_Struct(Atta,struct NetCDFAtt,Netcdf_atta);
-- Data_Get_Struct(Attb,struct NetCDFAtt,Netcdf_attb);
--
-- if(Netcdf_atta->ncid == Netcdf_atta->ncid &&
-- Netcdf_atta->varid == Netcdf_attb->varid &&
-- strcmp(Netcdf_atta->name,Netcdf_attb->name)==0){
-- return Qtrue;
-- } else {
-- return Qfalse;
-- }
-- } else {
-- return Qfalse;
-- }
--}
--
--/* Follow methods is to connect "NArray" with "Netcdf" */
--VALUE
--NetCDF_get_var_char(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_text(ncid,varid,(char *)ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var_byte(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_uchar(ncid,varid,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var_sint(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Csint_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_short(ncid,varid,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var_int(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Clint_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_int(ncid,varid,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var_float(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Cfloat_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_float(ncid,varid,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var_double(VALUE Var)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr;
-- struct NetCDFVar *Netcdf_var;
-- int i=0;
-- int ndimsp;
-- int *dimids;
-- size_t lengthp;
-- int *shape; /* NArray uses int instead of size_t */
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- dimids = ALLOCA_N(int,ndimsp);
-- if (ndimsp != 0){
-- shape = ALLOCA_N(int,ndimsp);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- shape[ndimsp-1-i]=lengthp;
-- }
-- } else {
-- ndimsp = 1;
-- shape = ALLOCA_N(int,1);
-- shape[0]=1;
-- }
--
-- Cdouble_to_NArray(NArray,ndimsp,shape,ptr);
--
-- status = nc_get_var_double(ncid,varid,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_var1_char(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR)NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- c_count[i]=1;
-- nc_tlen = 1+nc_tlen;
-- }
--
--
--
--
-- Cbyte_to_NArray(NArray,ndims,c_count,ptr);
-- status = nc_get_var1_text(ncid,varid,c_start,(char *)ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_var1_byte(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR)NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- c_count[i]=1;
-- nc_tlen = 1+nc_tlen;
-- }
--
--
--
--
-- Cbyte_to_NArray(NArray,ndims,c_count,ptr);
-- status = nc_get_var1_uchar(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_var1_sint(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- c_count[i]=1;
-- nc_tlen = nc_tlen+1;
-- }
--
-- Csint_to_NArray(NArray,ndims,c_count,ptr);
--
-- status = nc_get_var1_short(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_var1_int(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR)NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- c_count[i]=1;
-- nc_tlen= nc_tlen+1;
-- }
--
-- Clint_to_NArray(NArray,ndims,c_count,ptr);
--
-- status = nc_get_var1_int(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_var1_float(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR)NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- c_count[i]=1;
-- nc_tlen = nc_tlen+1;
-- }
--
-- Cfloat_to_NArray(NArray,ndims,c_count,ptr);
--
-- status = nc_get_var1_float(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_var1_double(VALUE Var,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int dimids[NC_MAX_DIMS];
-- size_t dimlen;
-- int *c_count;
-- int nc_tlen=0;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR)NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- c_count=ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- l_start = NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- c_count[i]=1;
-- nc_tlen = nc_tlen+1;
-- }
--
-- Cdouble_to_NArray(NArray,ndims,c_count,ptr);
--
-- status = nc_get_var1_double(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--
--}
--
--VALUE
--NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Cbyte_to_NArray(NArray,ndims,shape,ptr);
--
-- status = nc_get_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Cbyte_to_NArray(NArray,ndims,shape,ptr);
--
-- status = nc_get_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
--
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Csint_to_NArray(NArray,ndims,shape,ptr);
--
--
-- status = nc_get_vars_short(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
--
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Clint_to_NArray(NArray,ndims,shape,ptr);
--
--
-- status = nc_get_vars_int(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
--
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Cfloat_to_NArray(NArray,ndims,shape,ptr);
--
--
-- status = nc_get_vars_float(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--VALUE
--NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int *shape; /* NArray uses int instead of size_t */
-- int ndims;
-- int *dimids;
-- int nc_tlen=1;
-- size_t dimlen;
-- VALUE NArray;
--
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid = Netcdf_var->ncid;
-- varid = Netcdf_var->varid;
--
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
-- if(ndims == 0) {
-- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
-- }
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims){
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start = ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride is too short\n");
-- }
-- for(i=0;i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0){
-- rb_raise(rb_eNetcdfError,"stride cannot be zero\n");
-- }
-- }
-- }
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- c_count[i]=(dimlen-c_start[i]-1)/c_stride[i]+1;
-- }
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) <ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end= NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end +=dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- }
-- }
--
-- for(i=0;i<ndims;i++){
-- nc_tlen = nc_tlen*c_count[i];
-- }
--
-- shape = ALLOCA_N(int,ndims);
-- for(i=0;i<ndims;i++){
-- shape[ndims-1-i]=c_count[i];
-- }
--
-- Cdouble_to_NArray(NArray,ndims,shape,ptr);
--
-- status = nc_get_vars_double(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- OBJ_TAINT(NArray);
-- return NArray;
--}
--
--
--VALUE
--NetCDF_put_var_char(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Array_to_Cbyte_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(unsigned char,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status );
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array in the '%s'\n",var_name);
-- }
-- status = nc_put_var_text(ncid,varid,(char *)ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var_byte(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Array_to_Cbyte_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(unsigned char,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status );
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array in the '%s'\n",var_name);
-- }
-- status = nc_put_var_uchar(ncid,varid,ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var_short(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- Array_to_Csint_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(short,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status);
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-- }
--
-- status = nc_put_var_short(ncid,varid,ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var_int(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Array_to_Clint_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(int,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status);
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-- }
--
--
-- status = nc_put_var_int(ncid,varid,ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_put_var_float(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Array_to_Cfloat_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(float,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status);
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-- }
--
-- status = nc_put_var_float(ncid,varid,ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var_double(VALUE Var,VALUE NArray)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr,scalar;
-- int len,i=0;
-- struct NetCDFVar *Netcdf_var;
-- int nc_tlen=1;
-- int ndimsp;
-- int dimids[NC_MAX_DIMS];
-- size_t lengthp;
-- char *var_name;
--
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
--
-- Array_to_Cdouble_len(NArray,ptr,len);
--
-- status = nc_inq_varndims(ncid,varid,&ndimsp);
-- if(status != NC_NOERR) NC_RAISE(status);
-- for(i=0;i<ndimsp;i++){
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
-- nc_inq_dimlen(ncid,dimids[i],&lengthp);
-- nc_tlen=lengthp*nc_tlen;
-- }
-- if(len == 1 && len != nc_tlen){
-- scalar = *ptr;
-- ptr = ALLOCA_N(double,nc_tlen);
-- for(i=0;i<nc_tlen;i++){ptr[i]=scalar;}
-- } else if(len != nc_tlen){
-- var_name=ALLOCA_N(char,NC_MAX_NAME);
-- status = nc_inq_varname(ncid,varid,var_name);
-- if(status != NC_NOERR) NC_RAISE(status);
-- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
-- }
--
-- status = nc_put_var_double(ncid,varid,ptr);
-- if(status !=NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var1_char(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Cbyte(NArray,ptr);
--
-- status = nc_put_var1_text(ncid,varid,c_start,(char *)ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var1_byte(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Cbyte(NArray,ptr);
--
-- status = nc_put_var1_uchar(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var1_sint(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Csint(NArray,ptr);
--
-- status = nc_put_var1_short(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--VALUE
--NetCDF_put_var1_int(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Clint(NArray,ptr);
--
-- status = nc_put_var1_int(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var1_float(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Cfloat(NArray,ptr);
--
-- status = nc_put_var1_float(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_var1_double(VALUE Var,VALUE NArray,VALUE start)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr;
-- int i;
-- struct NetCDFVar *Netcdf_var;
-- long l_start;
-- size_t *c_start;
-- int ndims;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid,varid,&ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
--
-- dimids = ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid,varid,dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) <ndims) {
-- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-- }
--
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0;i<ndims;i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
--
-- }
-- Array_to_Cdouble(NArray,ptr);
--
-- status = nc_put_var1_double(ncid,varid,c_start,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Cbyte_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(unsigned char,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- unsigned char *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Cbyte_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(unsigned char,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--VALUE
--NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- short *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Csint_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(short,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_short(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- int *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Clint_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(int,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "length of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_int(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- float *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Cfloat_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(float,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_float(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--
--VALUE
--NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
--{
-- int ncid;
-- int varid;
-- int status;
-- double *ptr,scalar;
-- int len,i;
-- int c_count_all=1;
-- struct NetCDFVar *Netcdf_var;
-- long l_start, l_end;
-- size_t *c_start;
-- size_t *c_count;
-- ptrdiff_t *c_stride;
-- int ndims;
-- int *shape;
-- int *dimids;
-- size_t dimlen;
--
-- rb_secure(4);
-- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
-- ncid=Netcdf_var->ncid;
-- varid=Netcdf_var->varid;
-- status = nc_inq_varndims(ncid, varid, &ndims);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- dimids=ALLOCA_N(int,ndims);
-- status = nc_inq_vardimid(ncid, varid, dimids);
-- if(status != NC_NOERR) NC_RAISE(status);
--
-- Check_Type(start,T_ARRAY);
-- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-- }
-- c_start=ALLOCA_N(size_t,ndims);
-- for(i=0; i<ndims; i++){
-- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-- if(l_start < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_start += dimlen;
-- }
-- c_start[i]=l_start;
-- }
--
-- c_stride=ALLOCA_N(ptrdiff_t,ndims);
-- switch(TYPE(stride)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_stride[i]=1;
-- }
-- break;
-- default:
-- Check_Type(stride,T_ARRAY);
-- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
-- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-- }
-- }
-- }
--
-- Array_to_Cdouble_len_shape(NArray,ptr,len,shape);
--
-- c_count=ALLOCA_N(size_t,ndims);
-- switch(TYPE(end)){
-- case T_NIL:
-- for(i=0; i<ndims; i++){
-- c_count[i]=shape[i];
-- }
-- c_count_all=len;
-- break;
-- default:
-- Check_Type(end,T_ARRAY);
-- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-- }
-- for(i=0; i<ndims; i++){
-- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-- if(l_end < 0) {
-- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
-- if(status != NC_NOERR) NC_RAISE(status);
-- l_end += dimlen;
-- }
-- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
-- c_count_all=c_count[i]*c_count_all;
-- }
-- if(len == 1 && len != c_count_all){
-- scalar = *ptr;
-- ptr = ALLOCA_N(double,c_count_all);
-- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
-- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-- status = nc_put_vars_double(ncid,varid,c_start,c_count,c_stride,ptr);
-- if(status != NC_NOERR) NC_RAISE(status);
-- return Qnil;
--}
--
--void
--Init_netcdfraw(void)
--{
-- mNumRu = rb_define_module("NumRu");
--
-- /* Difinitions of the classes */
-- cNetCDF = rb_define_class_under(mNumRu, "NetCDF", rb_cObject);
-- cNetCDFDim = rb_define_class_under(mNumRu, "NetCDFDim", rb_cObject);
-- cNetCDFAtt = rb_define_class_under(mNumRu, "NetCDFAtt", rb_cObject);
-- cNetCDFVar = rb_define_class_under(mNumRu, "NetCDFVar", rb_cObject);
--
-- rb_eNetcdfError = rb_define_class("NetcdfError",rb_eStandardError);
-- rb_eNetcdfBadid = rb_define_class("NetcdfBadid",rb_eNetcdfError);
-- rb_eNetcdfNfile = rb_define_class("NetcdfNfile",rb_eNetcdfError);
-- rb_eNetcdfExist = rb_define_class("NetcdfExist",rb_eNetcdfError);
-- rb_eNetcdfInval = rb_define_class("NetcdfInval",rb_eNetcdfError);
-- rb_eNetcdfPerm = rb_define_class("NetcdfPerm",rb_eNetcdfError);
-- rb_eNetcdfNotindefine = rb_define_class("NetcdfNotindefine",rb_eNetcdfError);
-- rb_eNetcdfIndefine = rb_define_class("NetcdfIndefine",rb_eNetcdfError);
-- rb_eNetcdfInvalcoords = rb_define_class("NetcdfInvalcoords",rb_eNetcdfError);
-- rb_eNetcdfMaxdims = rb_define_class("NetcdfMaxdims",rb_eNetcdfError);
-- rb_eNetcdfNameinuse = rb_define_class("NetcdfNameinuse",rb_eNetcdfError);
-- rb_eNetcdfNotatt = rb_define_class("NetcdfNotatt",rb_eNetcdfError);
-- rb_eNetcdfMaxatts = rb_define_class("NetcdfMaxatts",rb_eNetcdfError);
-- rb_eNetcdfBadtype = rb_define_class("NetcdfBadtype",rb_eNetcdfError);
-- rb_eNetcdfBaddim = rb_define_class("NetcdfBaddim",rb_eNetcdfError);
-- rb_eNetcdfUnlimpos = rb_define_class("NetcdFUnlimpos",rb_eNetcdfError);
-- rb_eNetcdfMaxvars = rb_define_class("NetcdfMaxvars",rb_eNetcdfError);
-- rb_eNetcdfNotvar = rb_define_class("NetcdfNotvar",rb_eNetcdfError);
-- rb_eNetcdfGlobal = rb_define_class("NetcdfGlobal",rb_eNetcdfError);
-- rb_eNetcdfNotnc = rb_define_class("NetcdfNotnc",rb_eNetcdfError);
-- rb_eNetcdfSts = rb_define_class("NetcdfSts",rb_eNetcdfError);
-- rb_eNetcdfMaxname = rb_define_class("NetcdfMaxname",rb_eNetcdfError);
-- rb_eNetcdfUnlimit = rb_define_class("NetcdfUnlimit",rb_eNetcdfError);
-- rb_eNetcdfNorecvars = rb_define_class("NetcdfNorecvars",rb_eNetcdfError);
-- rb_eNetcdfChar = rb_define_class("NetcdfChar",rb_eNetcdfError);
-- rb_eNetcdfEdge = rb_define_class("NetcdfEdge",rb_eNetcdfError);
-- rb_eNetcdfStride = rb_define_class("NetcdfStride",rb_eNetcdfError);
-- rb_eNetcdfBadname = rb_define_class("NetcdfBadname",rb_eNetcdfError);
-- /* N.B. following must match value in ncx.h */
-- rb_eNetcdfRange = rb_define_class("NetcdfRange",rb_eNetcdfError);
-- rb_eNetcdfNomem = rb_define_class("NetcdfNomem",rb_eNetcdfError);
-- /* Global error status */
-- rb_eNetcdfEntool = rb_define_class("NetcdfEntool",rb_eNetcdfError);
-- rb_eNetcdfExdr = rb_define_class("NetcdfExdr",rb_eNetcdfError);
-- rb_eNetcdfSyserr = rb_define_class("NetcdfSyserr",rb_eNetcdfError);
-- /* Global options variable. Used to determine behavior of error handler. */
-- rb_eNetcdfFatal = rb_define_class("NetcdfFatal",rb_eNetcdfError);
--
-- /* Class Constants Definition */
-- rb_define_const(cNetCDF, "NC_NOWRITE", INT2FIX(NC_NOWRITE));
-- rb_define_const(cNetCDF, "NC_WRITE", INT2FIX(NC_WRITE));
-- rb_define_const(cNetCDF, "NC_SHARE", INT2FIX(NC_SHARE));
-- rb_define_const(cNetCDF, "NC_CLOBBER", INT2FIX(NC_CLOBBER));
-- rb_define_const(cNetCDF, "NC_NOCLOBBER", INT2FIX(NC_NOCLOBBER));
--
-- /* Difinitions of the ruby methods */
-- /* The methods of the NetCDF class */
-- rb_define_singleton_method(cNetCDF,"nc_open",NetCDF_open,2);
-- rb_define_method(cNetCDF,"clone",NetCDF_clone,0);
-- rb_define_method(cNetCDF,"close",NetCDF_close,0);
-- /* rb_define_singleton_method(cNetCDF,"new",NetCDF_open,2); */
-- rb_define_singleton_method(cNetCDF,"nc_create",NetCDF_create,2);
-- rb_define_method(cNetCDF,"def_dim",NetCDF_def_dim,2);
-- rb_define_method(cNetCDF,"def_var",NetCDF_def_var,3);
-- rb_define_method(cNetCDF,"put_attraw",NetCDF_put_att,3);
-- rb_define_method(cNetCDF,"redef",NetCDF_redef,0);
-- rb_define_method(cNetCDF,"enddef",NetCDF_enddef,0);
-- rb_define_method(cNetCDF,"define_mode?",NetCDF_whether_in_define_mode,0);
-- rb_define_method(cNetCDF,"fill",NetCDF_fill,1);
-- rb_define_method(cNetCDF,"ndims",NetCDF_ndims,0);
-- rb_define_method(cNetCDF,"nvars",NetCDF_nvars,0);
-- rb_define_method(cNetCDF,"natts",NetCDF_natts,0);
-- rb_define_method(cNetCDF,"sync",NetCDF_sync,0);
-- rb_define_method(cNetCDF,"path",NetCDF_path,0);
-- rb_define_method(cNetCDF,"dim",NetCDF_dim,1);
-- rb_define_method(cNetCDF,"var",NetCDF_var,1);
-- rb_define_method(cNetCDF,"att",NetCDF_att,1);
-- rb_define_method(cNetCDF,"unlimited",NetCDF_unlimited,0);
-- rb_define_private_method(cNetCDF,"id2var",NetCDF_id2var,1);
-- rb_define_private_method(cNetCDF,"id2dim",NetCDF_id2dim,1);
-- rb_define_private_method(cNetCDF,"id2att",NetCDF_id2att,1);
-- rb_define_method(cNetCDF,"==",NetCDF_eql,1);
-- /* rb_define_method(cNetCDF,"eql?",NetCDF_eql,1); */
--
-- /* The methods of the NetCDFDim class */
-- rb_define_method(cNetCDFDim,"clone",NetCDF_dim_clone,0);
-- rb_define_method(cNetCDFDim,"length",NetCDF_dim_length,0);
-- rb_define_method(cNetCDFDim,"name=",NetCDF_dim_name,1);
-- rb_define_method(cNetCDFDim,"name",NetCDF_dim_inqname,0);
-- rb_define_method(cNetCDFDim,"unlimited?",NetCDF_dim_whether_unlimited,0);
-- rb_define_method(cNetCDFDim,"==",NetCDF_dim_eql,1);
-- /* rb_define_method(cNetCDFDim,"eql?",NetCDF_dim_eql,1); */
--
-- /* The methods of the NetCDFAtt class */
-- rb_define_method(cNetCDFAtt,"clone",NetCDF_att_clone,0);
-- rb_define_method(cNetCDFAtt,"name",NetCDF_att_inq_name,0);
-- rb_define_method(cNetCDFAtt,"name=",NetCDF_att_rename,1);
-- rb_define_method(cNetCDFAtt,"delete",NetCDF_att_delete,0);
-- rb_define_method(cNetCDFAtt,"copy",NetCDF_att_copy,1);
-- rb_define_method(cNetCDFAtt,"atttype",NetCDF_att_atttype,0);
-- rb_define_method(cNetCDFAtt,"typecode",NetCDF_att_typecode,0);
-- rb_define_method(cNetCDFAtt,"==",NetCDF_att_eql,1);
-- /* rb_define_method(cNetCDFAtt,"eql?",NetCDF_att_eql,1); */
-- rb_define_method(cNetCDFAtt,"putraw",NetCDF_att_put,2);
-- rb_define_method(cNetCDFAtt,"get",NetCDF_att_get,0);
--
-- /* The methods of the NetCDFVar class */
-- rb_define_method(cNetCDFVar,"clone",NetCDF_var_clone,0);
-- rb_define_method(cNetCDFVar,"name",NetCDF_var_inq_name,0);
-- rb_define_method(cNetCDFVar,"ndims",NetCDF_var_ndims,0);
-- rb_define_method(cNetCDFVar,"vartype",NetCDF_var_vartype,0);
-- rb_define_method(cNetCDFVar,"typecode",NetCDF_var_typecode,0);
-- rb_define_method(cNetCDFVar,"ntype",NetCDF_var_vartype,0);
-- rb_define_method(cNetCDFVar,"natts",NetCDF_var_natts,0);
-- rb_define_method(cNetCDFVar,"file",NetCDF_var_file,0);
-- rb_define_method(cNetCDFVar,"name=",NetCDF_var_rename,1);
-- rb_define_method(cNetCDFVar,"att",NetCDF_var_att,1);
-- rb_define_method(cNetCDFVar,"put_attraw",NetCDF_put_att_var,3);
-- rb_define_method(cNetCDFVar,"dims",NetCDF_var_dims,0);
-- rb_define_method(cNetCDFVar,"dim",NetCDF_var_dim,1);
-- /*rb_define_private_method(cNetCDFVar,"id2dim",NetCDF_var_id2dim,1); */
-- rb_define_private_method(cNetCDFVar,"id2att",NetCDF_var_id2att,1);
-- rb_define_method(cNetCDFVar,"==",NetCDF_var_eql,1);
-- /* rb_define_method(cNetCDFVar,"eql?",NetCDF_var_eql,1); */
--
-- /* The "get*" or "put*" methods in the NetCDFVar class */
-- rb_define_method(cNetCDFVar,"put_var_char",NetCDF_put_var_char,1);
-- rb_define_method(cNetCDFVar,"put_var_byte",NetCDF_put_var_byte,1);
-- rb_define_method(cNetCDFVar,"put_var_sint",NetCDF_put_var_short,1);
-- rb_define_method(cNetCDFVar,"put_var_int",NetCDF_put_var_int,1);
-- rb_define_method(cNetCDFVar,"put_var_sfloat",NetCDF_put_var_float,1);
-- rb_define_method(cNetCDFVar,"put_var_float",NetCDF_put_var_double,1);
--
-- rb_define_method(cNetCDFVar,"put_vars_char",NetCDF_put_vars_char,4);
-- rb_define_method(cNetCDFVar,"put_vars_byte",NetCDF_put_vars_byte,4);
-- rb_define_method(cNetCDFVar,"put_vars_sint",NetCDF_put_vars_sint,4);
-- rb_define_method(cNetCDFVar,"put_vars_int",NetCDF_put_vars_int,4);
-- rb_define_method(cNetCDFVar,"put_vars_sfloat",NetCDF_put_vars_float,4);
-- rb_define_method(cNetCDFVar,"put_vars_float",NetCDF_put_vars_double,4);
--
-- rb_define_method(cNetCDFVar,"put_var1_char",NetCDF_put_var1_char,2);
-- rb_define_method(cNetCDFVar,"put_var1_byte",NetCDF_put_var1_byte,2);
-- rb_define_method(cNetCDFVar,"put_var1_sint",NetCDF_put_var1_sint,2);
-- rb_define_method(cNetCDFVar,"put_var1_int",NetCDF_put_var1_int,2);
-- rb_define_method(cNetCDFVar,"put_var1_sfloat",NetCDF_put_var1_float,2);
-- rb_define_method(cNetCDFVar,"put_var1_float",NetCDF_put_var1_double,2);
--
-- rb_define_method(cNetCDFVar,"get_var_char",NetCDF_get_var_char,0);
-- rb_define_method(cNetCDFVar,"get_var_byte",NetCDF_get_var_byte,0);
-- rb_define_method(cNetCDFVar,"get_var_sint",NetCDF_get_var_sint,0);
-- rb_define_method(cNetCDFVar,"get_var_int",NetCDF_get_var_int,0);
-- rb_define_method(cNetCDFVar,"get_var_sfloat",NetCDF_get_var_float,0);
-- rb_define_method(cNetCDFVar,"get_var_float",NetCDF_get_var_double,0);
--
-- rb_define_method(cNetCDFVar,"get_vars_char",NetCDF_get_vars_char,3);
-- rb_define_method(cNetCDFVar,"get_vars_byte",NetCDF_get_vars_byte,3);
-- rb_define_method(cNetCDFVar,"get_vars_sint",NetCDF_get_vars_sint,3);
-- rb_define_method(cNetCDFVar,"get_vars_int",NetCDF_get_vars_int,3);
-- rb_define_method(cNetCDFVar,"get_vars_sfloat",NetCDF_get_vars_float,3);
-- rb_define_method(cNetCDFVar,"get_vars_float",NetCDF_get_vars_double,3);
--
-- rb_define_method(cNetCDFVar,"get_var1_char",NetCDF_get_var1_char,1);
-- rb_define_method(cNetCDFVar,"get_var1_byte",NetCDF_get_var1_byte,1);
-- rb_define_method(cNetCDFVar,"get_var1_sint",NetCDF_get_var1_sint,1);
-- rb_define_method(cNetCDFVar,"get_var1_int",NetCDF_get_var1_int,1);
-- rb_define_method(cNetCDFVar,"get_var1_sfloat",NetCDF_get_var1_float,1);
-- rb_define_method(cNetCDFVar,"get_var1_float",NetCDF_get_var1_double,1);
--}
diff --git a/debian/patches/0004-Fix-FTBFS-Hardening.patch b/debian/patches/0004-Fix-FTBFS-Hardening.patch
deleted file mode 100644
index 554938f..0000000
--- a/debian/patches/0004-Fix-FTBFS-Hardening.patch
+++ /dev/null
@@ -1,2024 +0,0 @@
-From: Youhei SASAKI <uwabami at gfd-dennou.org>
-Date: Tue, 12 Jun 2012 18:25:08 +0900
-Subject: Fix FTBFS Hardening
-
-Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
----
- ext/numru/netcdfraw.c | 564 ++++++++++++++++++++++++-------------------------
- 1 file changed, 282 insertions(+), 282 deletions(-)
-
-diff --git a/ext/numru/netcdfraw.c b/ext/numru/netcdfraw.c
-index 9922d19..883212d 100644
---- a/ext/numru/netcdfraw.c
-+++ b/ext/numru/netcdfraw.c
-@@ -193,7 +193,7 @@
- obj = na_cast_object(obj, NA_SINT); \
- GetNArray(obj, na); \
- ptr = (int16_t *) NA_PTR(na,0); \
--}
-+}
- #define Array_to_Clint(obj, ptr) \
- { \
- struct NARRAY *na; \
-@@ -202,8 +202,8 @@
- ptr = (int32_t *) NA_PTR(na,0); \
- }
-
--#define NC_RAISE(status) rb_raise(err_status2class(status),(nc_strerror(status)))
--#define NC_RAISE2(status, str) rb_raise(err_status2class(status),"%s (%s)",nc_strerror(status),(str) )
-+#define NC_RAISE(status) rb_raise(err_status2class(status),(nc_strerror(status)), NULL)
-+#define NC_RAISE2(status, str) rb_raise(err_status2class(status),"%s (%s)",nc_strerror(status),(str), NULL )
-
- static VALUE mNumRu = 0;
- static VALUE cNetCDF;
-@@ -252,7 +252,7 @@ static VALUE rb_eNetcdfFatal;
- static VALUE rb_eNetcdfEntool;
- static VALUE rb_eNetcdfExdr;
- static VALUE rb_eNetcdfSyserr;
--
-+
-
- struct Netcdf{
- int ncid;
-@@ -285,7 +285,7 @@ NetCDF_init(int ncid,char *filename)
- Netcdffile->ncid=ncid;
- Netcdffile->closed=0;
- Netcdffile->name=xmalloc((strlen(filename)+1)*sizeof(char));
-- strcpy(Netcdffile->name,filename);
-+ strcpy(Netcdffile->name,filename);
- return(Netcdffile);
- }
-
-@@ -317,7 +317,7 @@ NetCDF_att_init(int ncid,int varid,char *attname)
- Netcdf_att->ncid=ncid;
- Netcdf_att->varid=varid;
- Netcdf_att->name=xmalloc((strlen(attname)+1)*sizeof(char));
-- strcpy(Netcdf_att->name,attname);
-+ strcpy(Netcdf_att->name,attname);
- return(Netcdf_att);
- }
-
-@@ -347,7 +347,7 @@ NetCDF_free(struct Netcdf *Netcdffile)
- if (!Netcdffile->closed){
- status = nc_close(Netcdffile->ncid); /* no error check -- not to stop during GC */
- }
-- free(Netcdffile->name);
-+ free(Netcdffile->name);
- free(Netcdffile);
- }
-
-@@ -570,7 +570,7 @@ NetCDF_close(file)
- ncid=Netcdffile->ncid;
- if(!Netcdffile->closed){
- status = nc_close(ncid);
-- if(status != NC_NOERR) NC_RAISE(status);
-+ if(status != NC_NOERR) NC_RAISE(status);
- Netcdffile->closed = 1;
- } else {
- rb_warn("file %s is already closed", Netcdffile->name);
-@@ -589,10 +589,10 @@ NetCDF_def_dim(VALUE file,VALUE dim_name,VALUE length)
- struct Netcdf *Netcdffile;
- struct NetCDFDim *Netcdf_dim;
- VALUE Dimension;
--
-+
- rb_secure(4);
- Data_Get_Struct(file,struct Netcdf,Netcdffile);
--
-+
- Check_Type(dim_name,T_STRING);
- c_dim_name=RSTRING_PTR(dim_name);
- c_length=NUM2UINT(length);
-@@ -683,19 +683,19 @@ NetCDF_put_att_numeric(int ncid, char *name,VALUE value,VALUE atttype, int varid
- len = na_val->total;
- ptr = na_val->ptr;
- switch(na_typecode){
-- case NA_BYTE:
-+ case NA_BYTE:
- status = nc_put_att_uchar(ncid,varid,name,NC_BYTE,len,(unsigned char *)ptr);
- break;
-- case NA_SINT:
-+ case NA_SINT:
- status = nc_put_att_short(ncid,varid,name,NC_SHORT,len,(short *)ptr);
- break;
-- case NA_LINT:
-+ case NA_LINT:
- status = nc_put_att_int(ncid,varid,name,NC_INT,len,(int *)ptr);
- break;
-- case NA_SFLOAT:
-+ case NA_SFLOAT:
- status = nc_put_att_float(ncid,varid,name,NC_FLOAT,len,(float *)ptr);
- break;
-- case NA_DFLOAT:
-+ case NA_DFLOAT:
- status = nc_put_att_double(ncid,varid,name,NC_DOUBLE,len,(double*)ptr);
- break;
- default:
-@@ -784,14 +784,14 @@ NetCDF_def_var(VALUE file,VALUE var_name,VALUE vartype,VALUE dimensions)
-
- c_var_name=RSTRING_PTR(var_name);
- c_ndims=RARRAY_LEN(dimensions);
--
-+
- Data_Get_Struct(file,struct Netcdf,Netcdffile);
- ncid=Netcdffile->ncid;
-
- if (TYPE(vartype) == T_STRING){
-- xtype = natype2nctype(RSTRING_PTR(vartype));
-+ xtype = natype2nctype(RSTRING_PTR(vartype));
- } else if (TYPE(vartype) == T_FIXNUM){
-- xtype = natypecode2nctype(NUM2INT(vartype));
-+ xtype = natypecode2nctype(NUM2INT(vartype));
- } else {
- rb_raise(rb_eNetcdfError,
- "type specfication must be by a string or nil");
-@@ -814,12 +814,12 @@ NetCDF_def_var(VALUE file,VALUE var_name,VALUE vartype,VALUE dimensions)
- rb_raise(rb_eNetcdfError, "No such object of the netCDF dimension class.");
- }
- }
--
-+
- status = nc_def_var(ncid,c_var_name,xtype,c_ndims,c_dimids,&varidp);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Netcdf_var = NetCDF_var_init(ncid,varidp,file);
--
-+
- Var=Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
- return Var;
- }
-@@ -840,10 +840,10 @@ NetCDF_dim(VALUE file,VALUE dim_name)
- ncid=Netcdffile->ncid;
- Check_Type(dim_name,T_STRING);
- c_dim_name=RSTRING_PTR(dim_name);
--
-+
- status = nc_inq_dimid(ncid,c_dim_name,&dimidp);
- if(status !=NC_NOERR){
-- if(status == NC_EBADDIM){
-+ if(status == NC_EBADDIM){
- return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
- } else{
- NC_RAISE(status);
-@@ -851,14 +851,14 @@ NetCDF_dim(VALUE file,VALUE dim_name)
- }
-
- Netcdf_dim=NetCDF_dim_init(ncid,dimidp);
--
-+
- Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
- return Dimension;
- }
-
--VALUE
-+VALUE
- NetCDF_var(VALUE file,VALUE var_name)
--{
-+{
- int ncid;
- int status;
- int varidp;
-@@ -871,16 +871,16 @@ NetCDF_var(VALUE file,VALUE var_name)
- ncid=Netcdffile->ncid;
- Check_Type(var_name,T_STRING);
- c_var_name=RSTRING_PTR(var_name);
--
-+
- status=nc_inq_varid(ncid,c_var_name,&varidp);
- if(status != NC_NOERR){
- if(status == NC_ENOTVAR){
- return(Qnil); /*2003/08/27 back to orig (from changes on 2003/02/03)*/
-- } else{
-+ } else{
- NC_RAISE(status);
- }
- }
--
-+
- Netcdf_var = NetCDF_var_init(ncid,varidp,file);
- Variable = Data_Wrap_Struct(cNetCDFVar,nc_mark_obj,NetCDF_var_free,Netcdf_var);
- return Variable;
-@@ -901,7 +901,7 @@ NetCDF_att(VALUE file,VALUE att_name)
- ncid=Netcdffile->ncid;
- Check_Type(att_name,T_STRING);
- c_att_name=RSTRING_PTR(att_name);
--
-+
-
- status = nc_inq_attid(ncid,NC_GLOBAL,c_att_name,&attnump);
- if(status != NC_NOERR){
-@@ -912,11 +912,11 @@ NetCDF_att(VALUE file,VALUE att_name)
- NC_RAISE(status);
- }
- }
--
-+
- Netcdf_att = NetCDF_att_init(ncid,NC_GLOBAL,c_att_name);
--
-+
- Attribute = Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
--
-+
- return Attribute;
- }
- VALUE
-@@ -926,7 +926,7 @@ NetCDF_fill(VALUE file,VALUE mode)
- int status;
- struct Netcdf *Netcdffile;
- int old_modep;
--
-+
- Data_Get_Struct(file,struct Netcdf,Netcdffile);
- ncid = Netcdffile->ncid;
- if(mode==Qfalse){
-@@ -964,7 +964,7 @@ NetCDF_redef(VALUE file)
- return Qtrue;
- }
-
--VALUE
-+VALUE
- NetCDF_enddef(VALUE file)
- {
- int ncid;
-@@ -975,7 +975,7 @@ NetCDF_enddef(VALUE file)
- Data_Get_Struct(file,struct Netcdf,Netcdffile);
- ncid=Netcdffile->ncid;
- status = nc_enddef(ncid);
-- if(status !=NC_NOERR){
-+ if(status !=NC_NOERR){
- if(status == NC_ENOTINDEFINE){
- return Qnil;
- }
-@@ -986,7 +986,7 @@ NetCDF_enddef(VALUE file)
- return Qtrue;
- }
-
--VALUE
-+VALUE
- NetCDF_whether_in_define_mode(VALUE file)
- {
- /* returns true if the NetCDF object is currently in the define mode,
-@@ -1018,7 +1018,7 @@ NetCDF_whether_in_define_mode(VALUE file)
- }
-
- VALUE
--NetCDF_open(VALUE mod,VALUE filename,VALUE omode)
-+NetCDF_open(VALUE mod,VALUE filename,VALUE omode)
- {
- int status;
- int ncid;
-@@ -1032,7 +1032,7 @@ NetCDF_open(VALUE mod,VALUE filename,VALUE omode)
- c_filename=RSTRING_PTR(filename);
- Check_Type(omode,T_FIXNUM);
- c_omode=NUM2INT(omode);
--
-+
- status = nc_open(c_filename,c_omode,&ncid);
- if(status !=NC_NOERR){NC_RAISE2(status,c_filename);}
-
-@@ -1049,13 +1049,13 @@ NetCDF_create(VALUE mod,VALUE filename,VALUE cmode)
- char* c_filename;
- int c_cmode;
- struct Netcdf *ncfile;
--
-+
- Check_Type(filename,T_STRING);
- SafeStringValue(filename);
- c_filename=RSTRING_PTR(filename);
- Check_Type(cmode,T_FIXNUM);
- c_cmode=NUM2INT(cmode);
--
-+
- status = nc_create(c_filename,c_cmode,&ncid);
- if(status != NC_NOERR) NC_RAISE2(status, c_filename);
-
-@@ -1063,7 +1063,7 @@ NetCDF_create(VALUE mod,VALUE filename,VALUE cmode)
- return( Data_Wrap_Struct(cNetCDF,0,NetCDF_free,ncfile) );
- }
-
--VALUE
-+VALUE
- NetCDF_ndims(VALUE file)
- {
- int ncid;
-@@ -1080,7 +1080,7 @@ NetCDF_ndims(VALUE file)
- return Integer;
- }
-
--VALUE
-+VALUE
- NetCDF_nvars(VALUE file)
- {
- int ncid;
-@@ -1096,7 +1096,7 @@ NetCDF_nvars(VALUE file)
- return Integer;
- }
-
--VALUE
-+VALUE
- NetCDF_natts(VALUE file)
- {
- int ncid;
-@@ -1127,10 +1127,10 @@ NetCDF_unlimited(VALUE file)
- ncid=ncfile->ncid;
- status=nc_inq_unlimdim(ncid,&unlimdimidp);
- if(status !=NC_NOERR) NC_RAISE(status);
--
-+
- Netcdf_dim = NetCDF_dim_init(ncid,unlimdimidp);
--
-- /* If unlimdimidp=-1,No unlimited dimension is defined in the netCDF dataset */
-+
-+ /* If unlimdimidp=-1,No unlimited dimension is defined in the netCDF dataset */
- if(unlimdimidp != -1)
- {
- Dimension = Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim);
-@@ -1141,7 +1141,7 @@ NetCDF_unlimited(VALUE file)
- return Qnil;
- }
- }
--
-+
- VALUE
- NetCDF_sync(VALUE file)
- {
-@@ -1162,7 +1162,7 @@ NetCDF_path(VALUE file)
- {
- char *path;
- struct Netcdf *ncfile;
--
-+
- Data_Get_Struct(file,struct Netcdf,ncfile);
- path=ncfile->name;
- return(rb_str_new2(path));
-@@ -1176,14 +1176,14 @@ NetCDF_dim_length(VALUE Dim)
- int dimid;
- size_t lengthp;
- struct NetCDFDim *Netcdf_dim;
--
-+
- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
- ncid=Netcdf_dim->ncid;
- dimid=Netcdf_dim->dimid;
-
- status = nc_inq_dimlen(ncid,dimid,&lengthp);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- return(INT2NUM(lengthp));
- }
-
-@@ -1195,7 +1195,7 @@ NetCDF_dim_name(VALUE Dim,VALUE dimension_newname)
- int dimid;
- char *c_dim_name;
- struct NetCDFDim *Netcdf_dim;
--
-+
- rb_secure(4);
- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
- ncid=Netcdf_dim->ncid;
-@@ -1205,7 +1205,7 @@ NetCDF_dim_name(VALUE Dim,VALUE dimension_newname)
-
- status = nc_rename_dim(ncid,dimid,c_dim_name);
- if(status !=NC_NOERR) NC_RAISE(status);
--
-+
- return Qnil;
- }
-
-@@ -1218,14 +1218,14 @@ NetCDF_dim_inqname(VALUE Dim)
- char c_dim_name[NC_MAX_NAME];
- struct NetCDFDim *Netcdf_dim;
- VALUE str;
--
-+
- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
- ncid=Netcdf_dim->ncid;
- dimid=Netcdf_dim->dimid;
--
-+
- status = nc_inq_dimname(ncid,dimid,c_dim_name);
- if(status !=NC_NOERR) NC_RAISE(status);
--
-+
- str = rb_str_new2(c_dim_name);
- OBJ_TAINT(str);
- return(str);
-@@ -1237,7 +1237,7 @@ NetCDF_dim_whether_unlimited(VALUE Dim)
- int status;
- int uldid;
- struct NetCDFDim *Netcdf_dim;
--
-+
- Data_Get_Struct(Dim,struct NetCDFDim,Netcdf_dim);
- status=nc_inq_unlimdim(Netcdf_dim->ncid,&uldid);
- if(status !=NC_NOERR) NC_RAISE(status);
-@@ -1257,7 +1257,7 @@ NetCDF_att_inq_name(VALUE Att)
-
- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
- c_att_name=Netcdf_att->name;
--
-+
- str = rb_str_new2(c_att_name);
- OBJ_TAINT(str);
- return(str);
-@@ -1275,16 +1275,16 @@ NetCDF_att_rename(VALUE Att,VALUE new_att_name)
- Data_Get_Struct(Att,struct NetCDFAtt,Netcdf_att);
- ncid=Netcdf_att->ncid;
- varid=Netcdf_att->varid;
--
-+
- c_att_name=Netcdf_att->name;
--
-+
- Check_Type(new_att_name,T_STRING);
- SafeStringValue(new_att_name);
- c_new_att_name=StringValueCStr(new_att_name);
--
-+
- status = nc_rename_att(ncid,varid,c_att_name,c_new_att_name);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- strcpy(Netcdf_att->name,c_new_att_name);
- return Qnil;
- }
-@@ -1315,7 +1315,7 @@ NetCDF_id2var(VALUE file,VALUE varid)
- struct Netcdf *ncfile;
- struct NetCDFVar *Netcdf_var;
- VALUE Var;
--
-+
- Data_Get_Struct(file,struct Netcdf,ncfile);
- ncid=ncfile->ncid;
- Check_Type(varid,T_FIXNUM);
-@@ -1337,7 +1337,7 @@ NetCDF_id2att(VALUE file,VALUE attnum)
- char *c_att_name;
- VALUE Att;
- c_att_name=ALLOCA_N(char,NC_MAX_NAME);
--
-+
- Data_Get_Struct(file,struct Netcdf,ncfile);
- ncid=ncfile->ncid;
-
-@@ -1365,7 +1365,7 @@ NetCDF_var_id2att(VALUE Var,VALUE attnum)
- struct NetCDFAtt *Netcdf_att;
- char *c_att_name;
- VALUE Att;
--
-+
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
- c_varid=Netcdf_var->varid;
-@@ -1377,7 +1377,7 @@ NetCDF_var_id2att(VALUE Var,VALUE attnum)
-
- status = nc_inq_attname(ncid,c_varid,c_attnum,c_att_name);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Netcdf_att=NetCDF_att_init(ncid,c_varid,c_att_name);
- Att=Data_Wrap_Struct(cNetCDFAtt,0,Netcdf_att_free,Netcdf_att);
- return(Att);
-@@ -1402,7 +1402,7 @@ NetCDF_var_dims(VALUE Var)
- Dims = rb_ary_new();
- for(i=0;i<ndims;i++){
- Netcdf_dim = NetCDF_dim_init(ncid,dimids[ndims-1-i]);
-- rb_ary_push(Dims,
-+ rb_ary_push(Dims,
- Data_Wrap_Struct(cNetCDFDim,0,NetCDF_dim_free,Netcdf_dim));
- }
- return(Dims);
-@@ -1492,7 +1492,7 @@ NetCDF_att_atttype(VALUE Att)
- Attname = nctype2natype(xtypep);
- return(rb_str_new2(Attname));
- }
--
-+
- VALUE
- NetCDF_att_typecode(VALUE Att)
- {
-@@ -1510,10 +1510,10 @@ NetCDF_att_typecode(VALUE Att)
-
- status = nc_inq_atttype(ncid,varid,att_name,&xtypep);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- return(INT2NUM(nctype2natypecode(xtypep)));
- }
--
-+
- VALUE
- NetCDF_att_delete(VALUE Att)
- {
-@@ -1532,7 +1532,7 @@ NetCDF_att_delete(VALUE Att)
-
- status = nc_del_att(ncid,varid,c_att_name);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- return Qnil;
- }
-
-@@ -1544,13 +1544,13 @@ NetCDF_att_put(VALUE Att,VALUE value,VALUE atttype)
- */
- {
- struct NetCDFAtt *ncatt;
--
-+
- rb_secure(4);
- Data_Get_Struct(Att,struct NetCDFAtt,ncatt);
-- return( NetCDF_put_att__(ncatt->ncid, ncatt->name, value,
-+ return( NetCDF_put_att__(ncatt->ncid, ncatt->name, value,
- atttype, ncatt->varid) );
- }
--
-+
- VALUE
- NetCDF_att_get(VALUE Att)
- {
-@@ -1597,7 +1597,7 @@ NetCDF_att_get(VALUE Att)
-
- attlen[0]=lenp;
- Cbyte_to_NArray(NArray,1,attlen,up);
--
-+
- status = nc_get_att_uchar(ncid,varid,c_attname,up);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -1610,7 +1610,7 @@ NetCDF_att_get(VALUE Att)
-
- attlen[0]=lenp;
- Csint_to_NArray(NArray,1,attlen,sp);
--
-+
- status = nc_get_att_short(ncid,varid,c_attname,sp);
- if(status != NC_NOERR) NC_RAISE(status);
- OBJ_TAINT(NArray);
-@@ -1619,10 +1619,10 @@ NetCDF_att_get(VALUE Att)
- case NC_INT:
- status = nc_inq_attlen(ncid,varid,c_attname,&lenp);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- attlen[0]=lenp;
- Clint_to_NArray(NArray,1,attlen,ip);
--
-+
- status = nc_get_att_int(ncid,varid,c_attname,ip);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -1635,7 +1635,7 @@ NetCDF_att_get(VALUE Att)
-
- attlen[0]=lenp;
- Cfloat_to_NArray(NArray,1,attlen,fp);
--
-+
- status = nc_get_att_float(ncid,varid,c_attname,fp);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -1648,7 +1648,7 @@ NetCDF_att_get(VALUE Att)
-
- attlen[0]=lenp;
- Cdouble_to_NArray(NArray,1,attlen,dp);
--
-+
- status = nc_get_att_double(ncid,varid,c_attname,dp);
- if(status != NC_NOERR) NC_RAISE(status);
- OBJ_TAINT(NArray);
-@@ -1660,7 +1660,7 @@ NetCDF_att_get(VALUE Att)
- return Qnil;
- }
-
--
-+
- VALUE
- NetCDF_var_inq_name(VALUE Var)
- {
-@@ -1677,7 +1677,7 @@ NetCDF_var_inq_name(VALUE Var)
- varid=Netcdf_var->varid;
- status = nc_inq_varname(ncid,varid,c_var_name);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Var_name=rb_str_new2(c_var_name);
- OBJ_TAINT(Var_name);
- return Var_name;
-@@ -1694,7 +1694,7 @@ NetCDF_var_ndims(VALUE Var)
- VALUE Var_ndims;
-
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
- status = nc_inq_varndims(ncid,varid,&ndimsp);
-@@ -1712,15 +1712,15 @@ NetCDF_var_vartype(VALUE Var)
- nc_type xtypep;
- struct NetCDFVar *Netcdf_var;
- const char *Vartype;
--
-+
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
-
- status = nc_inq_vartype(ncid,varid,&xtypep);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Vartype=nctype2natype(xtypep);
- return(rb_str_new2(Vartype));
- }
-@@ -1733,19 +1733,19 @@ NetCDF_var_typecode(VALUE Var)
- int varid;
- nc_type xtypep;
- struct NetCDFVar *Netcdf_var;
--
-+
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
-
- status = nc_inq_vartype(ncid,varid,&xtypep);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- return(INT2NUM(nctype2natypecode(xtypep)));
- }
-
--
-+
- VALUE
- NetCDF_var_natts(VALUE Var)
- {
-@@ -1755,16 +1755,16 @@ NetCDF_var_natts(VALUE Var)
- int nattsp;
- struct NetCDFVar *Netcdf_var;
- VALUE Var_natts;
--
-+
-
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
--
-+
- status= nc_inq_varnatts(ncid,varid,&nattsp);
- if(status !=NC_NOERR) NC_RAISE(status);
--
-+
- Var_natts=INT2FIX(nattsp);
- return Var_natts;
- }
-@@ -1775,7 +1775,7 @@ NetCDF_var_file(VALUE Var)
- struct NetCDFVar *Netcdf_var;
- /* VALUE file; */
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- return (Netcdf_var->file);
- }
-
-@@ -1787,7 +1787,7 @@ NetCDF_var_rename(VALUE Var,VALUE var_new_name)
- int varid;
- char *c_var_new_name;
- struct NetCDFVar *Netcdf_var;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -1795,7 +1795,7 @@ NetCDF_var_rename(VALUE Var,VALUE var_new_name)
-
- Check_Type(var_new_name,T_STRING);
- c_var_new_name=StringValueCStr(var_new_name);
--
-+
- status = nc_rename_var(ncid,varid,c_var_new_name);
- if(status !=NC_NOERR) NC_RAISE(status);
-
-@@ -1815,13 +1815,13 @@ NetCDF_var_att(VALUE Var,VALUE att_name)
- VALUE Att;
-
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
--
-+
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
-
- Check_Type(att_name,T_STRING);
- c_att_name=StringValueCStr(att_name);
--
-+
- status = nc_inq_attid(ncid,varid,c_att_name,&c_attnump);
- if(status == NC_NOERR){
- Netcdf_att=NetCDF_att_init(ncid,varid,c_att_name);
-@@ -1839,17 +1839,17 @@ NetCDF_var_att(VALUE Var,VALUE att_name)
-
- /* Redifinition of the "==" and "eql?" methods */
-
--VALUE
-+VALUE
- NetCDF_eql(VALUE filea,VALUE fileb)
- {
- struct Netcdf *ncfilea;
- struct Netcdf *ncfileb;
--
-+
- if( rb_obj_is_kind_of(fileb, cNetCDF) ){
- Data_Get_Struct(filea,struct Netcdf,ncfilea);
- Data_Get_Struct(fileb,struct Netcdf,ncfileb);
--
-- if(ncfilea->ncid == ncfileb->ncid &&
-+
-+ if(ncfilea->ncid == ncfileb->ncid &&
- strcmp(ncfilea->name,ncfileb->name)==0){
- return Qtrue;
- } else {
-@@ -1865,12 +1865,12 @@ NetCDF_var_eql(VALUE Vara,VALUE Varb)
- {
- struct NetCDFVar *Netcdf_vara;
- struct NetCDFVar *Netcdf_varb;
--
-+
- if( rb_obj_is_kind_of(Varb, cNetCDFVar) ){
- Data_Get_Struct(Vara,struct NetCDFVar,Netcdf_vara);
- Data_Get_Struct(Varb,struct NetCDFVar,Netcdf_varb);
-
-- if(Netcdf_vara->ncid == Netcdf_varb->ncid &&
-+ if(Netcdf_vara->ncid == Netcdf_varb->ncid &&
- Netcdf_vara->varid == Netcdf_varb->varid){
- return Qtrue;
- } else {
-@@ -1881,7 +1881,7 @@ NetCDF_var_eql(VALUE Vara,VALUE Varb)
- }
- }
-
--VALUE
-+VALUE
- NetCDF_dim_eql(VALUE Dima,VALUE Dimb)
- {
- struct NetCDFDim *Netcdf_dima;
-@@ -1890,8 +1890,8 @@ NetCDF_dim_eql(VALUE Dima,VALUE Dimb)
- if( rb_obj_is_kind_of(Dimb, cNetCDFDim) ){
- Data_Get_Struct(Dima,struct NetCDFDim,Netcdf_dima);
- Data_Get_Struct(Dimb,struct NetCDFDim,Netcdf_dimb);
--
-- if(Netcdf_dima->ncid == Netcdf_dimb->ncid &&
-+
-+ if(Netcdf_dima->ncid == Netcdf_dimb->ncid &&
- Netcdf_dima->dimid == Netcdf_dimb->dimid){
- return Qtrue;
- } else {
-@@ -1907,16 +1907,16 @@ NetCDF_att_eql(VALUE Atta,VALUE Attb)
- {
- struct NetCDFAtt *Netcdf_atta;
- struct NetCDFAtt *Netcdf_attb;
--
-+
- if( rb_obj_is_kind_of(Attb, cNetCDFAtt) ){
- Data_Get_Struct(Atta,struct NetCDFAtt,Netcdf_atta);
- Data_Get_Struct(Attb,struct NetCDFAtt,Netcdf_attb);
--
-- if(Netcdf_atta->ncid == Netcdf_atta->ncid &&
-- Netcdf_atta->varid == Netcdf_attb->varid &&
-+
-+ if(Netcdf_atta->ncid == Netcdf_atta->ncid &&
-+ Netcdf_atta->varid == Netcdf_attb->varid &&
- strcmp(Netcdf_atta->name,Netcdf_attb->name)==0){
- return Qtrue;
-- } else {
-+ } else {
- return Qfalse;
- }
- } else {
-@@ -1961,7 +1961,7 @@ NetCDF_get_var_char(VALUE Var)
- }
-
- Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
--
-+
- status = nc_get_var_text(ncid,varid,(char *)ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2005,7 +2005,7 @@ NetCDF_get_var_byte(VALUE Var)
- }
-
- Cbyte_to_NArray(NArray,ndimsp,shape,ptr);
--
-+
- status = nc_get_var_uchar(ncid,varid,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2049,7 +2049,7 @@ NetCDF_get_var_sint(VALUE Var)
- }
-
- Csint_to_NArray(NArray,ndimsp,shape,ptr);
--
-+
- status = nc_get_var_short(ncid,varid,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2093,7 +2093,7 @@ NetCDF_get_var_int(VALUE Var)
- }
-
- Clint_to_NArray(NArray,ndimsp,shape,ptr);
--
-+
- status = nc_get_var_int(ncid,varid,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2181,7 +2181,7 @@ NetCDF_get_var_double(VALUE Var)
- }
-
- Cdouble_to_NArray(NArray,ndimsp,shape,ptr);
--
-+
- status = nc_get_var_double(ncid,varid,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2189,7 +2189,7 @@ NetCDF_get_var_double(VALUE Var)
- return NArray;
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_char(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2207,7 +2207,7 @@ NetCDF_get_var1_char(VALUE Var,VALUE start)
- int nc_tlen=0;
- VALUE NArray;
-
--
-+
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
-@@ -2216,12 +2216,12 @@ NetCDF_get_var1_char(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2234,14 +2234,14 @@ NetCDF_get_var1_char(VALUE Var,VALUE start)
- l_start += dimlen;
- }
- c_start[i]=l_start;
--
-+
- c_count[i]=1;
- nc_tlen = 1+nc_tlen;
- }
--
--
--
--
-+
-+
-+
-+
- Cbyte_to_NArray(NArray,ndims,c_count,ptr);
- status = nc_get_var1_text(ncid,varid,c_start,(char *)ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2251,7 +2251,7 @@ NetCDF_get_var1_char(VALUE Var,VALUE start)
-
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_byte(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2269,7 +2269,7 @@ NetCDF_get_var1_byte(VALUE Var,VALUE start)
- int nc_tlen=0;
- VALUE NArray;
-
--
-+
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
-@@ -2278,12 +2278,12 @@ NetCDF_get_var1_byte(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2296,14 +2296,14 @@ NetCDF_get_var1_byte(VALUE Var,VALUE start)
- l_start += dimlen;
- }
- c_start[i]=l_start;
--
-+
- c_count[i]=1;
- nc_tlen = 1+nc_tlen;
- }
--
--
--
--
-+
-+
-+
-+
- Cbyte_to_NArray(NArray,ndims,c_count,ptr);
- status = nc_get_var1_uchar(ncid,varid,c_start,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2313,7 +2313,7 @@ NetCDF_get_var1_byte(VALUE Var,VALUE start)
-
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_sint(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2339,12 +2339,12 @@ NetCDF_get_var1_sint(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2360,9 +2360,9 @@ NetCDF_get_var1_sint(VALUE Var,VALUE start)
- c_count[i]=1;
- nc_tlen = nc_tlen+1;
- }
--
-+
- Csint_to_NArray(NArray,ndims,c_count,ptr);
--
-+
- status = nc_get_var1_short(ncid,varid,c_start,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2371,7 +2371,7 @@ NetCDF_get_var1_sint(VALUE Var,VALUE start)
-
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_int(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2397,12 +2397,12 @@ NetCDF_get_var1_int(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2418,9 +2418,9 @@ NetCDF_get_var1_int(VALUE Var,VALUE start)
- c_count[i]=1;
- nc_tlen= nc_tlen+1;
- }
--
-+
- Clint_to_NArray(NArray,ndims,c_count,ptr);
--
-+
- status = nc_get_var1_int(ncid,varid,c_start,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2429,7 +2429,7 @@ NetCDF_get_var1_int(VALUE Var,VALUE start)
-
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_float(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2455,12 +2455,12 @@ NetCDF_get_var1_float(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2476,9 +2476,9 @@ NetCDF_get_var1_float(VALUE Var,VALUE start)
- c_count[i]=1;
- nc_tlen = nc_tlen+1;
- }
--
-+
- Cfloat_to_NArray(NArray,ndims,c_count,ptr);
--
-+
- status = nc_get_var1_float(ncid,varid,c_start,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2487,7 +2487,7 @@ NetCDF_get_var1_float(VALUE Var,VALUE start)
-
- }
-
--VALUE
-+VALUE
- NetCDF_get_var1_double(VALUE Var,VALUE start)
- {
- int ncid;
-@@ -2513,12 +2513,12 @@ NetCDF_get_var1_double(VALUE Var,VALUE start)
- if(ndims == 0) {
- rb_raise(rb_eNetcdfError,"Cannot specify a subset of a rank-0 scalar\n");
- }
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
- }
--
-+
- c_start=ALLOCA_N(size_t,ndims);
- c_count=ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
-@@ -2534,9 +2534,9 @@ NetCDF_get_var1_double(VALUE Var,VALUE start)
- c_count[i]=1;
- nc_tlen = nc_tlen+1;
- }
--
-+
- Cdouble_to_NArray(NArray,ndims,c_count,ptr);
--
-+
- status = nc_get_var1_double(ncid,varid,c_start,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2568,7 +2568,7 @@ NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -2578,7 +2578,7 @@ NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -2586,7 +2586,7 @@ NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2642,14 +2642,14 @@ NetCDF_get_vars_char(VALUE Var,VALUE start,VALUE end,VALUE stride)
- nc_tlen = nc_tlen*c_count[i];
- }
-
--
-+
- shape = ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
--
-+
- Cbyte_to_NArray(NArray,ndims,shape,ptr);
--
-+
- status = nc_get_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2680,7 +2680,7 @@ NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -2690,7 +2690,7 @@ NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -2698,7 +2698,7 @@ NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2754,14 +2754,14 @@ NetCDF_get_vars_byte(VALUE Var,VALUE start,VALUE end,VALUE stride)
- nc_tlen = nc_tlen*c_count[i];
- }
-
--
-+
- shape = ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
--
-+
- Cbyte_to_NArray(NArray,ndims,shape,ptr);
--
-+
- status = nc_get_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -2792,7 +2792,7 @@ NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -2802,7 +2802,7 @@ NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -2810,7 +2810,7 @@ NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2862,22 +2862,22 @@ NetCDF_get_vars_sint(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
- }
- }
--
-+
- for(i=0;i<ndims;i++){
- nc_tlen = nc_tlen*c_count[i];
- }
--
-+
- shape = ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
-
- Csint_to_NArray(NArray,ndims,shape,ptr);
--
-+
-
- status = nc_get_vars_short(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- OBJ_TAINT(NArray);
- return NArray;
- }
-@@ -2905,7 +2905,7 @@ NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -2915,7 +2915,7 @@ NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -2923,7 +2923,7 @@ NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -2979,14 +2979,14 @@ NetCDF_get_vars_int(VALUE Var,VALUE start,VALUE end,VALUE stride)
- for(i=0;i<ndims;i++){
- nc_tlen = nc_tlen*c_count[i];
- }
--
-+
- shape = ALLOCA_N(int,ndims);
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
-
- Clint_to_NArray(NArray,ndims,shape,ptr);
--
-+
-
- status = nc_get_vars_int(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3018,7 +3018,7 @@ NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -3028,7 +3028,7 @@ NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -3036,7 +3036,7 @@ NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3088,7 +3088,7 @@ NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
- }
- }
--
-+
- for(i=0;i<ndims;i++){
- nc_tlen = nc_tlen*c_count[i];
- }
-@@ -3097,10 +3097,10 @@ NetCDF_get_vars_float(VALUE Var,VALUE start,VALUE end,VALUE stride)
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
--
-+
- Cfloat_to_NArray(NArray,ndims,shape,ptr);
--
--
-+
-+
- status = nc_get_vars_float(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -3131,7 +3131,7 @@ NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid = Netcdf_var->ncid;
- varid = Netcdf_var->varid;
--
-+
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
- if(ndims == 0) {
-@@ -3141,7 +3141,7 @@ NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims){
- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-@@ -3149,7 +3149,7 @@ NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_start = ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3201,7 +3201,7 @@ NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
- c_count[i]=(l_end-c_start[i])/c_stride[i]+1;
- }
- }
--
-+
- for(i=0;i<ndims;i++){
- nc_tlen = nc_tlen*c_count[i];
- }
-@@ -3210,9 +3210,9 @@ NetCDF_get_vars_double(VALUE Var,VALUE start,VALUE end,VALUE stride)
- for(i=0;i<ndims;i++){
- shape[ndims-1-i]=c_count[i];
- }
--
-+
- Cdouble_to_NArray(NArray,ndims,shape,ptr);
--
-+
- status = nc_get_vars_double(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
-
-@@ -3242,7 +3242,7 @@ NetCDF_put_var_char(VALUE Var,VALUE NArray)
- varid=Netcdf_var->varid;
-
- Array_to_Cbyte_len(NArray,ptr,len);
--
-+
- status = nc_inq_varndims(ncid,varid,&ndimsp);
- if(status != NC_NOERR) NC_RAISE(status);
- for(i=0;i<ndimsp;i++){
-@@ -3287,7 +3287,7 @@ NetCDF_put_var_byte(VALUE Var,VALUE NArray)
- varid=Netcdf_var->varid;
-
- Array_to_Cbyte_len(NArray,ptr,len);
--
-+
- status = nc_inq_varndims(ncid,varid,&ndimsp);
- if(status != NC_NOERR) NC_RAISE(status);
- for(i=0;i<ndimsp;i++){
-@@ -3331,7 +3331,7 @@ NetCDF_put_var_short(VALUE Var,VALUE NArray)
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
- Array_to_Csint_len(NArray,ptr,len);
--
-+
- status = nc_inq_varndims(ncid,varid,&ndimsp);
- if(status != NC_NOERR) NC_RAISE(status);
- for(i=0;i<ndimsp;i++){
-@@ -3396,8 +3396,8 @@ NetCDF_put_var_int(VALUE Var,VALUE NArray)
- if(status != NC_NOERR) NC_RAISE(status);
- rb_raise(rb_eNetcdfError,"Length of NArray don't equal to length of total array length in the '%s'\n",var_name);
- }
--
--
-+
-+
- status = nc_put_var_int(ncid,varid,ptr);
- if(status !=NC_NOERR) NC_RAISE(status);
- return Qnil;
-@@ -3418,15 +3418,15 @@ NetCDF_put_var_float(VALUE Var,VALUE NArray)
- int dimids[NC_MAX_DIMS];
- size_t lengthp;
- char *var_name;
--
--
-+
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
- varid=Netcdf_var->varid;
-
- Array_to_Cfloat_len(NArray,ptr,len);
--
-+
- status = nc_inq_varndims(ncid,varid,&ndimsp);
- if(status != NC_NOERR) NC_RAISE(status);
- for(i=0;i<ndimsp;i++){
-@@ -3512,7 +3512,7 @@ NetCDF_put_var1_char(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3520,11 +3520,11 @@ NetCDF_put_var1_char(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3533,7 +3533,7 @@ NetCDF_put_var1_char(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3563,7 +3563,7 @@ NetCDF_put_var1_byte(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3571,11 +3571,11 @@ NetCDF_put_var1_byte(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3584,7 +3584,7 @@ NetCDF_put_var1_byte(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3614,7 +3614,7 @@ NetCDF_put_var1_sint(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3622,11 +3622,11 @@ NetCDF_put_var1_sint(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3635,7 +3635,7 @@ NetCDF_put_var1_sint(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3664,7 +3664,7 @@ NetCDF_put_var1_int(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3672,11 +3672,11 @@ NetCDF_put_var1_int(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3685,7 +3685,7 @@ NetCDF_put_var1_int(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3715,7 +3715,7 @@ NetCDF_put_var1_float(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3723,11 +3723,11 @@ NetCDF_put_var1_float(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3736,7 +3736,7 @@ NetCDF_put_var1_float(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3766,7 +3766,7 @@ NetCDF_put_var1_double(VALUE Var,VALUE NArray,VALUE start)
- int ndims;
- int *dimids;
- size_t dimlen;
--
-+
- rb_secure(4);
- Data_Get_Struct(Var,struct NetCDFVar,Netcdf_var);
- ncid=Netcdf_var->ncid;
-@@ -3774,11 +3774,11 @@ NetCDF_put_var1_double(VALUE Var,VALUE NArray,VALUE start)
- status = nc_inq_varndims(ncid,varid,&ndims);
- if(status != NC_NOERR) NC_RAISE(status);
-
--
-+
- dimids = ALLOCA_N(int,ndims);
- status = nc_inq_vardimid(ncid,varid,dimids);
- if(status != NC_NOERR) NC_RAISE(status);
--
-+
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) <ndims) {
- rb_raise(rb_eNetcdfError,"Length of 'start' is too short\n");
-@@ -3787,7 +3787,7 @@ NetCDF_put_var1_double(VALUE Var,VALUE NArray,VALUE start)
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0;i<ndims;i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid,dimids[i],&dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3836,12 +3836,12 @@ NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3849,7 +3849,7 @@ NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -3860,12 +3860,12 @@ NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -3883,7 +3883,7 @@ NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -3900,11 +3900,11 @@ NetCDF_put_vars_char(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- ptr = ALLOCA_N(unsigned char,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
- status = nc_put_vars_text(ncid,varid,c_start,c_count,c_stride,(char *)ptr);
- if(status != NC_NOERR) NC_RAISE(status);
- return Qnil;
-@@ -3942,12 +3942,12 @@ NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -3955,7 +3955,7 @@ NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -3966,12 +3966,12 @@ NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -3989,7 +3989,7 @@ NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -4006,11 +4006,11 @@ NetCDF_put_vars_byte(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- ptr = ALLOCA_N(unsigned char,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-- }
-- }
--
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
-+ }
-+ }
-+
- status = nc_put_vars_uchar(ncid,varid,c_start,c_count,c_stride,ptr);
- if(status != NC_NOERR) NC_RAISE(status);
- return Qnil;
-@@ -4048,12 +4048,12 @@ NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -4061,7 +4061,7 @@ NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -4072,12 +4072,12 @@ NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -4095,7 +4095,7 @@ NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -4112,8 +4112,8 @@ NetCDF_put_vars_sint(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- ptr = ALLOCA_N(short,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
- }
- }
-
-@@ -4155,12 +4155,12 @@ NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -4168,7 +4168,7 @@ NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -4179,12 +4179,12 @@ NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -4202,7 +4202,7 @@ NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -4219,8 +4219,8 @@ NetCDF_put_vars_int(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- ptr = ALLOCA_N(int,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "length of the array does not agree with that of the subset\n");
-+ rb_raise(rb_eNetcdfError,
-+ "length of the array does not agree with that of the subset\n");
- }
- }
-
-@@ -4262,12 +4262,12 @@ NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -4275,7 +4275,7 @@ NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -4286,12 +4286,12 @@ NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -4309,7 +4309,7 @@ NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -4326,8 +4326,8 @@ NetCDF_put_vars_float(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride)
- ptr = ALLOCA_N(float,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
- }
- }
-
-@@ -4369,12 +4369,12 @@ NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride
-
- Check_Type(start,T_ARRAY);
- if(RARRAY_LEN(start) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'start' is too short\n");
- }
- c_start=ALLOCA_N(size_t,ndims);
- for(i=0; i<ndims; i++){
- l_start=NUM2INT(RARRAY_PTR(start)[ndims-1-i]);
--
-+
- if(l_start < 0) {
- status = nc_inq_dimlen(ncid, dimids[i], &dimlen);
- if(status != NC_NOERR) NC_RAISE(status);
-@@ -4382,7 +4382,7 @@ NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride
- }
- c_start[i]=l_start;
- }
--
-+
- c_stride=ALLOCA_N(ptrdiff_t,ndims);
- switch(TYPE(stride)){
- case T_NIL:
-@@ -4393,12 +4393,12 @@ NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride
- default:
- Check_Type(stride,T_ARRAY);
- if(RARRAY_LEN(stride) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'stride' is too short\n");
- }
- for(i=0; i<ndims; i++){
- c_stride[i]=NUM2INT(RARRAY_PTR(stride)[ndims-1-i]);
- if(c_stride[i]==0) {
-- rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
-+ rb_raise(rb_eNetcdfError, "stride cannot be zero\n");
- }
- }
- }
-@@ -4416,7 +4416,7 @@ NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride
- default:
- Check_Type(end,T_ARRAY);
- if(RARRAY_LEN(end) < ndims) {
-- rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
-+ rb_raise(rb_eNetcdfError, "Length of 'end' is too short\n");
- }
- for(i=0; i<ndims; i++){
- l_end=NUM2INT(RARRAY_PTR(end)[ndims-1-i]);
-@@ -4433,8 +4433,8 @@ NetCDF_put_vars_double(VALUE Var,VALUE NArray,VALUE start,VALUE end,VALUE stride
- ptr = ALLOCA_N(double,c_count_all);
- for(i=0;i<c_count_all;i++){ptr[i]=scalar;}
- } else if(len != c_count_all) {
-- rb_raise(rb_eNetcdfError,
-- "lengh of the array does not agree with that of the subset\n");
-+ rb_raise(rb_eNetcdfError,
-+ "lengh of the array does not agree with that of the subset\n");
- }
- }
-
-@@ -4482,7 +4482,7 @@ Init_netcdfraw(void)
- rb_eNetcdfEdge = rb_define_class("NetcdfEdge",rb_eNetcdfError);
- rb_eNetcdfStride = rb_define_class("NetcdfStride",rb_eNetcdfError);
- rb_eNetcdfBadname = rb_define_class("NetcdfBadname",rb_eNetcdfError);
-- /* N.B. following must match value in ncx.h */
-+ /* N.B. following must match value in ncx.h */
- rb_eNetcdfRange = rb_define_class("NetcdfRange",rb_eNetcdfError);
- rb_eNetcdfNomem = rb_define_class("NetcdfNomem",rb_eNetcdfError);
- /* Global error status */
-@@ -4525,7 +4525,7 @@ Init_netcdfraw(void)
- rb_define_private_method(cNetCDF,"id2var",NetCDF_id2var,1);
- rb_define_private_method(cNetCDF,"id2dim",NetCDF_id2dim,1);
- rb_define_private_method(cNetCDF,"id2att",NetCDF_id2att,1);
-- rb_define_method(cNetCDF,"==",NetCDF_eql,1);
-+ rb_define_method(cNetCDF,"==",NetCDF_eql,1);
- /* rb_define_method(cNetCDF,"eql?",NetCDF_eql,1); */
-
- /* The methods of the NetCDFDim class */
-@@ -4597,7 +4597,7 @@ Init_netcdfraw(void)
- rb_define_method(cNetCDFVar,"get_var_int",NetCDF_get_var_int,0);
- rb_define_method(cNetCDFVar,"get_var_sfloat",NetCDF_get_var_float,0);
- rb_define_method(cNetCDFVar,"get_var_float",NetCDF_get_var_double,0);
--
-+
- rb_define_method(cNetCDFVar,"get_vars_char",NetCDF_get_vars_char,3);
- rb_define_method(cNetCDFVar,"get_vars_byte",NetCDF_get_vars_byte,3);
- rb_define_method(cNetCDFVar,"get_vars_sint",NetCDF_get_vars_sint,3);
diff --git a/debian/patches/series b/debian/patches/series
index 7b84b25..a1e1e53 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,4 +1 @@
-0001-Change-NArray-Directory-for-Debian-s-Ruby-vendor-lib.patch
-0002-Change-Test-Path-for-running-under-test_runner.rb.patch
-0003-Update-directory-structure-suitable-for-Rubygems-Sty.patch
-0004-Fix-FTBFS-Hardening.patch
+0001-Change-FHS-For-RubyGems
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/ruby-netcdf.git
More information about the Pkg-grass-devel
mailing list