[DRE-commits] [SCM] ruby-grib.git branch, master, updated. debian/0.2.2-1-7-g411e831

Youhei SASAKI uwabami at gfd-dennou.org
Fri Jun 29 15:55:19 UTC 2012


The following commit has been merged in the master branch:
commit d6e0a6c3957a404e005d10ec06c809844e5e7c42
Author: Youhei SASAKI <uwabami at gfd-dennou.org>
Date:   Sun Jun 17 17:37:52 2012 +0900

    add patches
    
    Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>

diff --git a/debian/changelog b/debian/changelog
index e2e1023..3c0865f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,13 @@
+ruby-grib (0.2.2-2) unstable; urgency=low
+
+  * Refresh patches: using gbp-pq
+    - Fix for FTBFS(hardening), Thanks to Lucas, Andreas! (Closes: #676196)
+    - Fix RSpec LOAD_PATH in order to running RSpec during Build
+  * Execute RSpec during build
+  * Add Depends: libgrib-api-tools
+
+ -- Youhei SASAKI <uwabami at gfd-dennou.org>  Sun, 17 Jun 2012 17:39:12 +0900
+
 ruby-grib (0.2.2-1) unstable; urgency=low
 
   * New upstream version: 0.2.2
diff --git a/debian/patches/0001-Fix-RSpec-LOAD_PATH.patch b/debian/patches/0001-Fix-RSpec-LOAD_PATH.patch
new file mode 100644
index 0000000..71ba960
--- /dev/null
+++ b/debian/patches/0001-Fix-RSpec-LOAD_PATH.patch
@@ -0,0 +1,29 @@
+From: Debian Ruby Extras Maintainers
+ <pkg-ruby-extras-maintainers at lists.alioth.debian.org>
+Date: Sun, 17 Jun 2012 17:37:56 +0900
+Subject: Fix RSpec LOAD_PATH
+
+---
+ spec/spec_helper.rb |   14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
+index a9cc64a..596f836 100644
+--- a/spec/spec_helper.rb
++++ b/spec/spec_helper.rb
+@@ -1,8 +1,8 @@
+-$LOAD_PATH.unshift File.expand_path(File.join('..','ext'), File.dirname(__FILE__))
+-$LOAD_PATH.unshift File.expand_path(File.join('..','lib'), File.dirname(__FILE__))
+-alias :_require :require
+-def require(arg)
+-  arg = "grib.so" if arg == "numru/grib.so"
+-  _require(arg)
+-end
++#$LOAD_PATH.unshift File.expand_path(File.join('..','ext'), File.dirname(__FILE__))
++#$LOAD_PATH.unshift File.expand_path(File.join('..','lib'), File.dirname(__FILE__))
++#alias :_require :require
++#def require(arg)
++#  arg = "grib.so" if arg == "numru/grib.so"
++#  _require(arg)
++#end
+ require "numru/grib"
diff --git a/debian/patches/0001-Ad-hoc-fix-Hardening.patch b/debian/patches/0002-Ad-hoc-fix-Hardening.patch
similarity index 60%
rename from debian/patches/0001-Ad-hoc-fix-Hardening.patch
rename to debian/patches/0002-Ad-hoc-fix-Hardening.patch
index 323386c..b9ebb8a 100644
--- a/debian/patches/0001-Ad-hoc-fix-Hardening.patch
+++ b/debian/patches/0002-Ad-hoc-fix-Hardening.patch
@@ -4,20 +4,19 @@ Subject: Ad hoc fix Hardening
 
 Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
 ---
- ext/grib.c |    3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ ext/grib.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
 diff --git a/ext/grib.c b/ext/grib.c
-index 1cf886a..bd31d32 100644
+index 1cf886a..53ee66c 100644
 --- a/ext/grib.c
 +++ b/ext/grib.c
-@@ -11,7 +11,8 @@
+@@ -11,7 +11,7 @@
  static void
  check_error(int code)
  {
 -  if (code) rb_raise(rb_eRuntimeError, grib_get_error_message(code));
-+  // dirty hack for -Werror=format-security
-+  if (code) rb_raise(rb_eRuntimeError, grib_get_error_message(code), NULL);
++  if (code) rb_raise(rb_eRuntimeError, "%s", grib_get_error_message(code));
  };
  
  
diff --git a/debian/patches/0002-Fix-ext-library-location.patch b/debian/patches/0002-Fix-ext-library-location.patch
deleted file mode 100644
index fa02644..0000000
--- a/debian/patches/0002-Fix-ext-library-location.patch
+++ /dev/null
@@ -1,1734 +0,0 @@
-From: Youhei SASAKI <uwabami at gfd-dennou.org>
-Date: Tue, 12 Jun 2012 10:18:50 +0900
-Subject: Fix ext library location
-
-Signed-off-by: Youhei SASAKI <uwabami at gfd-dennou.org>
----
- ext/extconf.rb       |   16 -
- ext/grib.c           |  809 --------------------------------------------------
- ext/numru/extconf.rb |    7 +
- ext/numru/grib.c     |  809 ++++++++++++++++++++++++++++++++++++++++++++++++++
- metadata.yml         |    6 +-
- rb-grib.gemspec      |    2 +-
- spec/spec_helper.rb  |    7 -
- 7 files changed, 820 insertions(+), 836 deletions(-)
- delete mode 100644 ext/extconf.rb
- delete mode 100644 ext/grib.c
- create mode 100644 ext/numru/extconf.rb
- create mode 100644 ext/numru/grib.c
-
-diff --git a/ext/extconf.rb b/ext/extconf.rb
-deleted file mode 100644
-index eab2b41..0000000
---- a/ext/extconf.rb
-+++ /dev/null
-@@ -1,16 +0,0 @@
--require "mkmf"
--
--begin
--  require "rubygems"
--  paths = Gem.find_files("narray.h").map{|d| File.dirname(d)}
--rescue LoadError
--  paths = []
--end
--paths += [$archdir, $sitearchdir, $vendorarchdir]
--dir_config("narray")
--find_header("narray.h", *paths)
--
--dir_config("grib_api")
--if have_header("grib_api.h") && have_library("grib_api")
--  create_makefile("numru/grib")
--end
-diff --git a/ext/grib.c b/ext/grib.c
-deleted file mode 100644
-index bd31d32..0000000
---- a/ext/grib.c
-+++ /dev/null
-@@ -1,809 +0,0 @@
--#include <stdio.h>
--#include <stdlib.h>
--#include "ruby.h"
--#include "grib_api.h"
--#include "narray.h"
--
--
--#define MAX_VALUE_LENGTH 1024
--
--// error check
--static void
--check_error(int code)
--{
--  // dirty hack for -Werror=format-security
--  if (code) rb_raise(rb_eRuntimeError, grib_get_error_message(code), NULL);
--};
--
--
--
--
--// flexible length array
--#define BUF_SIZE 256
--#define MAX_BUF_NUM 1000
--typedef struct {
--  grib_handle ***buffer;
--  size_t size;
--  size_t len;
--} msg_array;
--static msg_array*
--alloc_msg_array(void)
--{
--  msg_array *ary = ALLOC(msg_array);
--  if (ary) {
--    ary->buffer = (grib_handle***) malloc(sizeof(grib_handle**)*MAX_BUF_NUM);
--    if (ary->buffer) {
--      ary->buffer[0] = (grib_handle**) malloc(sizeof(grib_handle*)*BUF_SIZE);
--      if (ary->buffer[0]) {
--	ary->size = BUF_SIZE;
--	ary->len = 0;
--	return ary;
--      }
--      free(ary->buffer);
--    }
--    free(ary);
--  }
--  return NULL;
--}
--static
--void free_msg_array(msg_array *ary)
--{
--  int i, j;
--  int num = ary->size/BUF_SIZE;
--  int len;
--  for (i=0; i<num; i++) {
--    len = i==num-1 ? ary->len%BUF_SIZE : BUF_SIZE;
--    for (j=0; j<len; j++) grib_handle_delete(ary->buffer[i][j]);
--    free(ary->buffer[i]);
--  }
--  free(ary->buffer);
--  free(ary);
--}
--static void
--push_msg(msg_array *ary, grib_handle *handle)
--{
--  int idx = ary->size/BUF_SIZE-1;
--  if (ary->len >= ary->size) {
--    idx += 1;
--    if (idx < MAX_BUF_NUM) {
--      ary->buffer[idx] = (grib_handle**)malloc(sizeof(grib_handle*)*BUF_SIZE);
--      if (ary->buffer[idx]) {
--	ary->size += BUF_SIZE;
--      } else {
--	rb_raise(rb_eRuntimeError, "cannot allocate memory");
--      }
--    } else {
--      rb_raise(rb_eRuntimeError, "cannot allocate memory");
--    }
--  }
--  ary->buffer[idx][ary->len%BUF_SIZE] = handle;
--  ary->len += 1;
--}
--static grib_handle*
--get_msg(msg_array *ary, size_t index)
--{
--  if (index < ary->len) {
--    return ary->buffer[index/BUF_SIZE][index%BUF_SIZE];
--  } else {
--    rb_raise(rb_eRuntimeError, "index exceed size of array");
--  }
--  return NULL;
--}
--
--
--// variable list
--typedef struct var_list var_list;
--struct var_list {
--  char *vname;
--  long ni;
--  long nj;
--  char *gtype;
--  long ltype_id;
--  char *ltype;
--  msg_array *ary;
--  var_list *next;
--  VALUE file;
--  long disc;
--  long mtabl;
--  long cent;
--  long ltabl;
--  long categ;
--  long pnum;
--};
--static var_list*
--var_list_alloc(VALUE file)
--{
--  var_list *var = ALLOC(var_list);
--  if (var) {
--    var->ary = alloc_msg_array();
--    if (var->ary) {
--      var->vname = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH*2);
--      if (var->vname) {
--	var->gtype = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH);
--	if (var->gtype) {
--	  var->ltype = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH);
--	  if (var->ltype) {
--	    var->next = NULL;
--	    var->file = file;
--	    return var;
--	  }
--	  free(var->gtype);
--	}
--	free(var->vname);
--      }
--      free_msg_array(var->ary);
--    }
--    free(var);
--  }
--  return NULL;
--}
--static void
--var_list_free(var_list *var)
--{
--  var_list *next;
--  while(var) {
--    free_msg_array(var->ary);
--    free(var->vname);
--    free(var->gtype);
--    free(var->ltype);
--    var->file = Qnil;
--    next = var->next;
--    free(var);
--    var = next;
--  }
--}
--static void
--push_msg_var(var_list **pvar, grib_handle *handle, VALUE file)
--{
--  size_t len = MAX_VALUE_LENGTH;
--  char vname[MAX_VALUE_LENGTH];
--  /*
--  if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
--      strcmp("unknown", vname) == 0) {
--    long id;
--    if (grib_get_long(handle, "indicatorOfParameter", &id) == GRIB_SUCCESS ||
--	grib_get_long(handle, "parameterNumber", &id) == GRIB_SUCCESS) {
--      sprintf(vname, "id%ld", id);
--    } else {
--      printf("%s\n", vname);
--      rb_raise(rb_eRuntimeError, "cannot get variable name");
--    }
--  }
--  */
--  long edition;
--  long cent, mtabl, pnum;
--  long disc, ltabl, categ;
--  long ni, nj, ltype_id;
--  char gtype[MAX_VALUE_LENGTH];
--  len = MAX_VALUE_LENGTH;
--
--  grib_get_long(handle, "editionNumber", &edition);
--  grib_get_long(handle, "centre", &cent);
--  if(grib_get_long(handle, "Ni", &ni) != GRIB_SUCCESS ||
--     grib_get_long(handle, "Nj", &nj) != GRIB_SUCCESS ||
--     grib_get_string(handle, "typeOfGrid", gtype, &len) != GRIB_SUCCESS ||
--     (grib_get_long(handle, "indicatorOfTypeOfLevel", &ltype_id) != GRIB_SUCCESS && grib_get_long(handle, "typeOfFirstFixedSurface", &ltype_id) != GRIB_SUCCESS))
--    rb_raise(rb_eRuntimeError, "connot identify grid type");
--  switch (edition) {
--  case 1:
--    if(grib_get_long(handle, "table2Version", &mtabl) != GRIB_SUCCESS ||
--       grib_get_long(handle, "indicatorOfParameter", &pnum) != GRIB_SUCCESS)
--      rb_raise(rb_eRuntimeError, "connot identify variable");
--    break;
--  case 2:
--    if (grib_get_long(handle, "tablesVersion", &mtabl) != GRIB_SUCCESS ||
--	grib_get_long(handle, "parameterNumber", &pnum) != GRIB_SUCCESS ||
--	grib_get_long(handle, "discipline", &disc) != GRIB_SUCCESS ||
--	grib_get_long(handle, "localTablesVersion", &ltabl) != GRIB_SUCCESS ||
--	grib_get_long(handle, "parameterCategory", &categ) != GRIB_SUCCESS)
--      rb_raise(rb_eRuntimeError, "connot identify variable");
--  }
--  var_list *last = NULL;
--  var_list *var = pvar[0];
--  if (var) {
--    while (var) {
--      if (var->cent == cent && var->mtabl == mtabl && var->pnum == pnum &&
--	  var->ni == ni && var->nj == nj &&
--	  strcmp(var->gtype,gtype)==0 &&
--	  var->ltype_id==ltype_id) {
--	if (edition == 1)
--	  push_msg(var->ary, handle);
--	else if (edition == 2 &&
--	    var->disc == disc && var->ltabl == ltabl &&  var->categ == categ)
--	  push_msg(var->ary, handle);
--	return;
--      }
--      last = var;
--      var = var->next;
--    }
--  }
--  var_list *var_new = var_list_alloc(file);
--  if (var_new == NULL)
--    rb_raise(rb_eRuntimeError, "cannot allocate memory");
--  var_new->cent = cent;
--  var_new->mtabl = mtabl;
--  var_new->pnum = pnum;
--  if (edition == 2) {
--    var_new->disc = disc;
--    var_new->ltabl = ltabl;
--    var_new->categ = categ;
--  }
--  var_new->ni = ni;
--  var_new->nj = nj;
--  var_new->ltype_id = ltype_id;
--  strcpy(var_new->gtype, gtype);
--
--  len = MAX_VALUE_LENGTH;
--  bzero(vname, len);
--  if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
--      strcmp("unknown", vname) == 0) {
--    sprintf(vname, "id%ld", pnum);
--  }
--  strcpy(var_new->vname, vname);
--
--  len = MAX_VALUE_LENGTH;
--  bzero(vname, len);
--  check_error(grib_get_string(handle, "typeOfLevel", vname, &len));
--  if (strcmp(vname, "unknown")==0 || strcmp(vname,"isobaricInhPa")== 0 || strcmp(vname,"pl")==0)
--    strcpy(var_new->ltype, vname);
--  else {
--    int i, j;
--    var_new->ltype[0] = vname[0];
--    for (i=1,j=1; i<strlen(vname); i++) {
--      if (vname[i]>=65 && vname[i]<=90) {
--	var_new->ltype[j] = vname[i]+32;
--	j++;
--      }
--    }
--    if (j==1)
--      strcpy(var_new->ltype, vname);
--    else
--      var_new->ltype[j] = 0;
--  }
--  push_msg(var_new->ary, handle);
--  if (last)
--    last->next = var_new;
--  else
--    pvar[0] = var_new;
--}
--
--
--
--
--VALUE cGrib;
--VALUE cVar;
--VALUE cMessage;
--
--typedef struct {
--  FILE *file;
--  char *fname;
--  var_list *var;
--} rg_file;
--typedef struct {
--  VALUE file;
--  var_list *var_list;
--} rg_var;
--typedef struct {
--  VALUE file;
--  grib_handle *handle;
--} rg_message;
--
--
--static void
--message_free(rg_message *message)
--{
--  if (message) free(message);
--}
--static void
--message_mark(rg_message *message)
--{
--  if (message && message->file != Qnil) rb_gc_mark(message->file);
--}
--static VALUE
--message_alloc(VALUE klass)
--{
--  rg_message *message = ALLOC(rg_message);
--  message->file = Qnil;
--  return Data_Wrap_Struct(klass, message_mark, message_free, message);
--}
--static void
--var_free(rg_var *var)
--{
--  if (var) free(var);
--}
--static void
--var_mark(rg_var *var)
--{
--  if (var && var->file != Qnil) rb_gc_mark(var->file);
--}
--static VALUE
--var_alloc(VALUE klass)
--{
--  rg_var *var = ALLOC(rg_var);
--  var->file = Qnil;
--  return Data_Wrap_Struct(klass, var_mark, var_free, var);
--}
--static void
--file_close(rg_file *gfile)
--{
--  if (gfile) {
--    if (gfile->var) {
--      var_list_free(gfile->var);
--      gfile->var = NULL;
--    }
--    if (gfile->file) {
--      fclose(gfile->file);
--      gfile->file = NULL;
--    }
--    if (gfile->fname) {
--      free(gfile->fname);
--      gfile->fname = NULL;
--    }
--  }
--}
--static void
--file_free(rg_file *gfile)
--{
--  if (gfile) {
--    file_close(gfile);
--    free(gfile);
--  }
--}
--static VALUE
--file_alloc(VALUE klass)
--{
--  rg_file *gfile = ALLOC(rg_file);
--  gfile->file = NULL;
--  gfile->fname = NULL;
--  gfile->var = NULL;
--  return Data_Wrap_Struct(klass, 0, file_free, gfile);
--}
--
--/*
--  NumRu::Grib.multi=(flag) -> True/False
--*/
--static VALUE
--rg_multi(VALUE self, VALUE flag)
--{
--  if (flag == Qtrue)
--    grib_multi_support_on(0);
--  else if (flag == Qfalse)
--    grib_multi_support_off(0);
--  else
--    rb_raise(rb_eArgError, "flag must be true or false");
--  return flag;
--}
--
--/*
--  NumRu::Grib#initialize(filename, [, mode])
--*/
--static VALUE
--rg_file_initialize(int argc, VALUE *argv, VALUE self)
--{
--  char *fname, *mode;
--  VALUE rfname, rmode;
--  rb_scan_args(argc, argv, "11", &rfname, &rmode);
--  fname = StringValueCStr(rfname);
--  if (rmode == Qnil)
--    mode = "r";
--  else
--    mode = StringValueCStr(rmode);
--
--  FILE *file = fopen(fname, mode);
--  if (!file)
--    rb_raise(rb_eRuntimeError, "unable to open file %s", fname);
--
--  rg_file *gfile;
--  Data_Get_Struct(self, rg_file, gfile);
--  gfile->file = file;
--  gfile->fname = ALLOC_N(char, strlen(fname)+1);
--  strcpy(gfile->fname, fname);
--
--  int error;
--  grib_handle *handle;
--  var_list *var = NULL;
--  while ((handle = grib_handle_new_from_file(0, file, &error))) {
--    check_error(error);
--    if (handle == NULL)
--      rb_raise(rb_eRuntimeError, "unable to create handle in %s", fname);
--    push_msg_var(&var, handle, self);
--  }
--  gfile->var = var;
--  var_list *var2;
--  const char *vname;
--  char buf[MAX_VALUE_LENGTH];
--  int first_ltype, first_gtype;
--  int i;
--  while (var) {
--    vname = var->vname;
--    var2 = var->next;
--    i = 0;
--    first_ltype = 1;
--    first_gtype = 1;
--    while (var2) {
--      if (strcmp(var2->vname, vname) == 0) {
--	if (var->ltype_id != var2->ltype_id) {
--	  if (first_ltype) {
--	    if (strcmp(var->ltype,"isobaricInhPa") != 0 && strcmp(var->ltype,"pl") !=0) {
--	      if (strcmp(var->ltype, "unknown")==0)
--		sprintf(buf, "%s_level%ld", var->vname, var->ltype_id);
--	      else
--		sprintf(buf, "%s_%s", var->vname, var->ltype);
--	      strcpy(var->vname, buf);
--	    }
--	    first_ltype = 0;
--	  }
--	  if (strcmp(var2->ltype,"isobaricInhPa") != 0 && strcmp(var2->ltype,"pl") != 0) {
--	    if (strcmp(var2->ltype, "unknown")==0)
--	      sprintf(buf, "%s_level%ld", var2->vname, var2->ltype_id);
--	    else
--	      sprintf(buf, "%s_%s", var2->vname, var2->ltype);
--	    strcpy(var2->vname, buf);
--	  }
--	} else if (strcmp(var->gtype, var2->gtype) != 0) {
--	  if (first_gtype) {
--	    sprintf(buf, "%s_%s", var->vname, var->gtype);
--	    strcpy(var->vname, buf);
--	    first_gtype = 0;
--	  }
--	  sprintf(buf, "%s_%s", var2->vname, var2->gtype);
--	  strcpy(var2->vname, buf);
--	} else {
--	  if (i==0) {
--	    sprintf(buf, "%s_%d", var->vname, i);
--	    strcpy(var->vname, buf);
--	    i += 1;
--	  }
--	  sprintf(buf, "%s_%d", var2->vname, i);
--	  strcpy(var2->vname, buf);
--	  i += 1;
--	}
--      }
--      var2 = var2->next;
--    }
--    var = var->next;
--  }
--  
--  return self;
--}
--/*
--  NumRu::Grib#close() -> nil
-- */
--static VALUE
--rg_file_close(VALUE self)
--{
--  rg_file *gfile;
--  Data_Get_Struct(self, rg_file, gfile);
--  file_close(gfile);
--  return Qnil;
--}
--
--/*
--  NumRu::Grib#path() -> String
--*/
--static VALUE
--rg_file_path(VALUE self)
--{
--  rg_file *gfile;
--  Data_Get_Struct(self, rg_file, gfile);
--  return rb_str_new2(gfile->fname);
--}
--
--/*
--  NumRu::Grib#var_names() -> Array
--*/
--static VALUE
--rg_file_var_names(VALUE self)
--{
--  rg_file *gfile;
--  Data_Get_Struct(self, rg_file, gfile);
--  VALUE ary = rb_ary_new();
--  var_list *var = gfile->var;
--  while (var) {
--    rb_ary_push(ary, rb_str_new2(var->vname));
--    var = var->next;
--  }
--  return ary;
--}
--
--static VALUE id_init;
--/*
--  NumRu::Grib#var(String) -> NumRu::GribVar
--*/
--static VALUE
--rg_file_var(VALUE self, VALUE rvname)
--{
--  char *vname = StringValueCStr(rvname);
--  rg_file *gfile;
--  Data_Get_Struct(self, rg_file, gfile);
--  var_list *var_list = gfile->var;
--  while (var_list) {
--    if (strcmp(var_list->vname, vname) == 0) {
--      VALUE rvar = var_alloc(cVar);
--      rg_var *var;
--      Data_Get_Struct(rvar, rg_var, var);
--      var->file = self;
--      var->var_list = var_list;
--      rb_funcall(rvar, id_init, 0);
--      return rvar;
--    }
--    var_list = var_list->next;
--  }
--  rb_raise(rb_eArgError, "cannot find variable: %s", vname);
--}
--
--/*
--  NumRu::GribVar#file() -> NumRu::Grib
--*/
--static VALUE
--rg_var_file(VALUE self)
--{
--  rg_var *var;
--  Data_Get_Struct(self, rg_var, var);
--  return var->file;
--}
--
--/*
--  NumRu::GribVar#name() -> String
--*/
--static VALUE
--rg_var_name(VALUE self)
--{
--  rg_var *var;
--  Data_Get_Struct(self, rg_var, var);
--  return rb_str_new2(var->var_list->vname);
--}
--
--/*
--  NumRu::GribVar#get_messages() -> Array
--*/
--static VALUE
--rg_var_get_messages(VALUE self)
--{
--  rg_var *var;
--  Data_Get_Struct(self, rg_var, var);
--  var_list *var_list = var->var_list;
--  size_t len = var_list->ary->len;
--  VALUE ary = rb_ary_new2(len);
--  rg_message *message;
--  VALUE rmessage;
--  int i;
--  for (i=0; i<len; i++) {
--    rmessage = message_alloc(cMessage);
--    Data_Get_Struct(rmessage, rg_message, message);
--    message->file = self;
--    message->handle = get_msg(var_list->ary, i);
--    rb_ary_store(ary, i, rmessage);
--  }
--  return ary;
--
--}
--
--/*
--  NumRu::GribMessage#initialize()
--*/
--static VALUE
--rg_message_initialize(VALUE self, VALUE file)
--{
--  rg_message *message;
--  Data_Get_Struct(self, rg_message, message);
--  message->file = file;
--  return self;
--}
--
--/*
--  NumRu::GribMessage#get_keys() -> Array
--*/
--static VALUE
--rg_message_get_keys(int argc, VALUE *argv, VALUE self)
--{
--  VALUE rflag, rns;
--  unsigned long flag = GRIB_KEYS_ITERATOR_SKIP_READ_ONLY || GRIB_KEYS_ITERATOR_SKIP_COMPUTED;
--  //  unsigned long flag = GRIB_KEYS_ITERATOR_ALL_KEYS;
--  char *name_space = NULL;
--  rb_scan_args(argc, argv, "02", &rflag, &rns);
--  if (rflag != Qnil) flag = NUM2ULONG(rflag);
--  if (rns != Qnil) name_space = StringValueCStr(rns);
--    
--  rg_message *message;
--  Data_Get_Struct(self, rg_message, message);
--  grib_keys_iterator *ki = NULL;
--  ki = grib_keys_iterator_new(message->handle, flag, name_space);
--  if (!ki)
--    rb_raise(rb_eRuntimeError, "unable to create key iterator");
--  VALUE keys = rb_ary_new();
--  while (grib_keys_iterator_next(ki)) {
--    const char *name = grib_keys_iterator_get_name(ki);
--    rb_ary_push(keys, rb_str_new2(name));
--  }
--  grib_keys_iterator_delete(ki);
--  return keys;
--}
--
--/*
--  NumRu::GribMessage#get_value(name [,type]) -> String
--*/
--static VALUE
--rg_message_get_value(int argc, VALUE *argv, VALUE self)
--{
--  VALUE rname, rtype;
--  rb_scan_args(argc, argv, "11", &rname, &rtype);
--  char *name = StringValueCStr(rname);
--  int type;
--  rg_message *message;
--  Data_Get_Struct(self, rg_message, message);
--  if (rtype == Qnil)
--    grib_get_native_type(message->handle, name, &type);
--  else
--    type = NUM2INT(rtype);
--  size_t len;
--  VALUE ret = Qnil;
--  grib_get_size(message->handle, name, &len);
--  switch (type) {
--  case GRIB_TYPE_UNDEFINED:
--  case GRIB_TYPE_STRING:
--  case GRIB_TYPE_LABEL:
--    {
--      char value[MAX_VALUE_LENGTH];
--      len = MAX_VALUE_LENGTH;
--      bzero(value, len);
--      if (grib_get_string(message->handle, name, value, &len) == GRIB_SUCCESS) {
--	if (value[len-1] == '\0') len--;
--	ret = rb_str_new(value, len);
--      }
--    }
--    break;
--  case GRIB_TYPE_BYTES:
--    {
--      unsigned char value[MAX_VALUE_LENGTH];
--      len = MAX_VALUE_LENGTH;
--      bzero(value, len);
--      if (grib_get_bytes(message->handle, name, value, &len) == GRIB_SUCCESS)
--	ret = rb_str_new((char*)value, len);
--    }
--    break;
--  case GRIB_TYPE_LONG:
--    {
--      if (len == 1) {
--	long l;
--	if (rtype == Qnil) {
--	  char value[MAX_VALUE_LENGTH];
--	  len = MAX_VALUE_LENGTH;
--	  bzero(value, len);
--	  if (grib_get_string(message->handle, name, value, &len) == GRIB_SUCCESS) {
--	    check_error(grib_get_long(message->handle, name, &l));
--	    if (atol(value) == l)
--	      ret = LONG2NUM(l);
--	    else
--	      ret = rb_str_new2(value);
--	  }
--	} else {
--	  check_error(grib_get_long(message->handle, name, &l));
--	  ret = LONG2NUM(l);
--	}	  
--      } else {
--	int shape[1];
--	struct NARRAY *nary;
--	shape[0] = len;
--	VALUE rnary = na_make_object(NA_LINT, 1, shape, cNArray);
--	GetNArray(rnary, nary);
--	if (grib_get_long_array(message->handle, name, (long*)nary->ptr, &len) == GRIB_SUCCESS)
--	  ret = rnary;
--      }
--    }
--    break;
--  case GRIB_TYPE_DOUBLE:
--    {
--      if (len == 1) {
--	double value;
--	if (grib_get_double(message->handle, name, &value) == GRIB_SUCCESS)
--	  ret = rb_float_new(value);
--      } else {
--	int shape[1];
--	struct NARRAY *nary;
--	shape[0] = len;
--	VALUE rnary = na_make_object(NA_DFLOAT, 1, shape, cNArray);
--	GetNArray(rnary, nary);
--	if (grib_get_double_array(message->handle, name, (double*)nary->ptr, &len) == GRIB_SUCCESS)
--	  ret = rnary;
--      }
--    }
--    break;
--  default:
--    rb_raise(rb_eArgError, "type is invalid: %d", type);
--  }
--  return ret;
--}
--
--/*
--  NumRu::GribMessage#get_data() -> [lon, lat, value]
--*/
--static VALUE
--rg_message_get_data(VALUE self)
--{
--  rg_message *message;
--  Data_Get_Struct(self, rg_message, message);
--  int error;
--  grib_iterator *iter = grib_iterator_new(message->handle, 0, &error);
--  check_error(error);
--  long np;
--  check_error(grib_get_long(message->handle, "numberOfPoints", &np));
--  double *lon, *lat, *value;
--  VALUE na_lon, na_lat, na_value;
--  struct NARRAY *nary;
--  int shape[1];
--  shape[0] = np;
--  na_lon = na_make_object(NA_DFLOAT, 1, shape, cNArray);
--  GetNArray(na_lon, nary);
--  lon = (double*) nary->ptr;
--  na_lat = na_make_object(NA_DFLOAT, 1, shape, cNArray);
--  GetNArray(na_lat, nary);
--  lat = (double*) nary->ptr;
--  na_value = na_make_object(NA_DFLOAT, 1, shape, cNArray);
--  GetNArray(na_value, nary);
--  value = (double*) nary->ptr;
--  int n = 0;
--  double lo, la, val;
--  while( grib_iterator_next(iter, &la, &lo, &val) ) {
--    lat[n] = la;
--    lon[n] = lo;
--    value[n] = val;
--    n++;
--  }
--  grib_iterator_delete(iter);
--  return rb_ary_new3(3, na_lon, na_lat, na_value);
--}
--
--
--
--void Init_grib()
--{
--  rb_require("narray");
--
--  id_init = rb_intern("init");
--
--  VALUE mNumRu = rb_define_module("NumRu");
--  cGrib = rb_define_class_under(mNumRu, "Grib", rb_cObject);
--  cVar = rb_define_class_under(mNumRu, "GribVar", rb_cObject);
--  cMessage = rb_define_class_under(mNumRu, "GribMessage", rb_cObject);
--
--  grib_multi_support_on(0);
--
--  //rb_define_singleton_method(cGrib, "open", rg_open, -1);
--  rb_define_singleton_method(cGrib, "multi=", rg_multi, 1);
--
--  rb_define_alloc_func(cGrib, file_alloc);
--  rb_define_method(cGrib, "initialize", rg_file_initialize, -1);
--  rb_define_method(cGrib, "close", rg_file_close, 0);
--  rb_define_method(cGrib, "path", rg_file_path, 0);
--  rb_define_method(cGrib, "var_names", rg_file_var_names, 0);
--  rb_define_method(cGrib, "var", rg_file_var, 1);
--
--  rb_define_alloc_func(cVar, var_alloc);
--  rb_define_method(cVar, "file", rg_var_file, 0);
--  rb_define_method(cVar, "name", rg_var_name, 0);
--  rb_define_method(cVar, "get_messages", rg_var_get_messages, 0);
--
--
--  rb_define_alloc_func(cMessage, message_alloc);
--  rb_define_method(cMessage, "initialize", rg_message_initialize, 1);
--  rb_define_method(cMessage, "get_keys", rg_message_get_keys, -1);
--  rb_define_method(cMessage, "get_value", rg_message_get_value, -1);
--  rb_define_method(cMessage, "get_data", rg_message_get_data, 0);
--
--  rb_define_const(cGrib, "TYPE_UNDEFINED", INT2NUM(GRIB_TYPE_UNDEFINED));
--  rb_define_const(cGrib, "TYPE_LONG", INT2NUM(GRIB_TYPE_LONG));
--  rb_define_const(cGrib, "TYPE_DOUBLE", INT2NUM(GRIB_TYPE_DOUBLE));
--  rb_define_const(cGrib, "TYPE_STRING", INT2NUM(GRIB_TYPE_STRING));
--  rb_define_const(cGrib, "TYPE_BYTES", INT2NUM(GRIB_TYPE_BYTES));
--  rb_define_const(cGrib, "TYPE_SECTION", INT2NUM(GRIB_TYPE_SECTION));
--  rb_define_const(cGrib, "TYPE_LABEL", INT2NUM(GRIB_TYPE_LABEL));
--  rb_define_const(cGrib, "TYPE_MISSING", INT2NUM(GRIB_TYPE_MISSING));
--
--  rb_define_const(cGrib, "NEAREST_SAME_GRID", ULONG2NUM(GRIB_NEAREST_SAME_GRID));
--  rb_define_const(cGrib, "NEAREST_SAME_DATA", ULONG2NUM(GRIB_NEAREST_SAME_DATA));
--  rb_define_const(cGrib, "NEAREST_SAME_POINT", ULONG2NUM(GRIB_NEAREST_SAME_POINT));
--
--  rb_define_const(cGrib, "KEYS_ITERATOR_ALL_KEYS", ULONG2NUM(GRIB_KEYS_ITERATOR_ALL_KEYS));
--  rb_define_const(cGrib, "KEYS_ITERATOR_SKIP_READ_ONLY", ULONG2NUM(GRIB_KEYS_ITERATOR_SKIP_READ_ONLY));
--}
-diff --git a/ext/numru/extconf.rb b/ext/numru/extconf.rb
-new file mode 100644
-index 0000000..7902a45
---- /dev/null
-+++ b/ext/numru/extconf.rb
-@@ -0,0 +1,7 @@
-+require "mkmf"
-+
-+dir_config("narray", $vendorarchdir, $vendorarchdir)
-+dir_config("grib_api", '/usr')
-+if have_header("grib_api.h") && have_library("grib_api")
-+  create_makefile("numru/grib")
-+end
-diff --git a/ext/numru/grib.c b/ext/numru/grib.c
-new file mode 100644
-index 0000000..bd31d32
---- /dev/null
-+++ b/ext/numru/grib.c
-@@ -0,0 +1,809 @@
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include "ruby.h"
-+#include "grib_api.h"
-+#include "narray.h"
-+
-+
-+#define MAX_VALUE_LENGTH 1024
-+
-+// error check
-+static void
-+check_error(int code)
-+{
-+  // dirty hack for -Werror=format-security
-+  if (code) rb_raise(rb_eRuntimeError, grib_get_error_message(code), NULL);
-+};
-+
-+
-+
-+
-+// flexible length array
-+#define BUF_SIZE 256
-+#define MAX_BUF_NUM 1000
-+typedef struct {
-+  grib_handle ***buffer;
-+  size_t size;
-+  size_t len;
-+} msg_array;
-+static msg_array*
-+alloc_msg_array(void)
-+{
-+  msg_array *ary = ALLOC(msg_array);
-+  if (ary) {
-+    ary->buffer = (grib_handle***) malloc(sizeof(grib_handle**)*MAX_BUF_NUM);
-+    if (ary->buffer) {
-+      ary->buffer[0] = (grib_handle**) malloc(sizeof(grib_handle*)*BUF_SIZE);
-+      if (ary->buffer[0]) {
-+	ary->size = BUF_SIZE;
-+	ary->len = 0;
-+	return ary;
-+      }
-+      free(ary->buffer);
-+    }
-+    free(ary);
-+  }
-+  return NULL;
-+}
-+static
-+void free_msg_array(msg_array *ary)
-+{
-+  int i, j;
-+  int num = ary->size/BUF_SIZE;
-+  int len;
-+  for (i=0; i<num; i++) {
-+    len = i==num-1 ? ary->len%BUF_SIZE : BUF_SIZE;
-+    for (j=0; j<len; j++) grib_handle_delete(ary->buffer[i][j]);
-+    free(ary->buffer[i]);
-+  }
-+  free(ary->buffer);
-+  free(ary);
-+}
-+static void
-+push_msg(msg_array *ary, grib_handle *handle)
-+{
-+  int idx = ary->size/BUF_SIZE-1;
-+  if (ary->len >= ary->size) {
-+    idx += 1;
-+    if (idx < MAX_BUF_NUM) {
-+      ary->buffer[idx] = (grib_handle**)malloc(sizeof(grib_handle*)*BUF_SIZE);
-+      if (ary->buffer[idx]) {
-+	ary->size += BUF_SIZE;
-+      } else {
-+	rb_raise(rb_eRuntimeError, "cannot allocate memory");
-+      }
-+    } else {
-+      rb_raise(rb_eRuntimeError, "cannot allocate memory");
-+    }
-+  }
-+  ary->buffer[idx][ary->len%BUF_SIZE] = handle;
-+  ary->len += 1;
-+}
-+static grib_handle*
-+get_msg(msg_array *ary, size_t index)
-+{
-+  if (index < ary->len) {
-+    return ary->buffer[index/BUF_SIZE][index%BUF_SIZE];
-+  } else {
-+    rb_raise(rb_eRuntimeError, "index exceed size of array");
-+  }
-+  return NULL;
-+}
-+
-+
-+// variable list
-+typedef struct var_list var_list;
-+struct var_list {
-+  char *vname;
-+  long ni;
-+  long nj;
-+  char *gtype;
-+  long ltype_id;
-+  char *ltype;
-+  msg_array *ary;
-+  var_list *next;
-+  VALUE file;
-+  long disc;
-+  long mtabl;
-+  long cent;
-+  long ltabl;
-+  long categ;
-+  long pnum;
-+};
-+static var_list*
-+var_list_alloc(VALUE file)
-+{
-+  var_list *var = ALLOC(var_list);
-+  if (var) {
-+    var->ary = alloc_msg_array();
-+    if (var->ary) {
-+      var->vname = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH*2);
-+      if (var->vname) {
-+	var->gtype = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH);
-+	if (var->gtype) {
-+	  var->ltype = (char*) malloc(sizeof(char)*MAX_VALUE_LENGTH);
-+	  if (var->ltype) {
-+	    var->next = NULL;
-+	    var->file = file;
-+	    return var;
-+	  }
-+	  free(var->gtype);
-+	}
-+	free(var->vname);
-+      }
-+      free_msg_array(var->ary);
-+    }
-+    free(var);
-+  }
-+  return NULL;
-+}
-+static void
-+var_list_free(var_list *var)
-+{
-+  var_list *next;
-+  while(var) {
-+    free_msg_array(var->ary);
-+    free(var->vname);
-+    free(var->gtype);
-+    free(var->ltype);
-+    var->file = Qnil;
-+    next = var->next;
-+    free(var);
-+    var = next;
-+  }
-+}
-+static void
-+push_msg_var(var_list **pvar, grib_handle *handle, VALUE file)
-+{
-+  size_t len = MAX_VALUE_LENGTH;
-+  char vname[MAX_VALUE_LENGTH];
-+  /*
-+  if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
-+      strcmp("unknown", vname) == 0) {
-+    long id;
-+    if (grib_get_long(handle, "indicatorOfParameter", &id) == GRIB_SUCCESS ||
-+	grib_get_long(handle, "parameterNumber", &id) == GRIB_SUCCESS) {
-+      sprintf(vname, "id%ld", id);
-+    } else {
-+      printf("%s\n", vname);
-+      rb_raise(rb_eRuntimeError, "cannot get variable name");
-+    }
-+  }
-+  */
-+  long edition;
-+  long cent, mtabl, pnum;
-+  long disc, ltabl, categ;
-+  long ni, nj, ltype_id;
-+  char gtype[MAX_VALUE_LENGTH];
-+  len = MAX_VALUE_LENGTH;
-+
-+  grib_get_long(handle, "editionNumber", &edition);
-+  grib_get_long(handle, "centre", &cent);
-+  if(grib_get_long(handle, "Ni", &ni) != GRIB_SUCCESS ||
-+     grib_get_long(handle, "Nj", &nj) != GRIB_SUCCESS ||
-+     grib_get_string(handle, "typeOfGrid", gtype, &len) != GRIB_SUCCESS ||
-+     (grib_get_long(handle, "indicatorOfTypeOfLevel", &ltype_id) != GRIB_SUCCESS && grib_get_long(handle, "typeOfFirstFixedSurface", &ltype_id) != GRIB_SUCCESS))
-+    rb_raise(rb_eRuntimeError, "connot identify grid type");
-+  switch (edition) {
-+  case 1:
-+    if(grib_get_long(handle, "table2Version", &mtabl) != GRIB_SUCCESS ||
-+       grib_get_long(handle, "indicatorOfParameter", &pnum) != GRIB_SUCCESS)
-+      rb_raise(rb_eRuntimeError, "connot identify variable");
-+    break;
-+  case 2:
-+    if (grib_get_long(handle, "tablesVersion", &mtabl) != GRIB_SUCCESS ||
-+	grib_get_long(handle, "parameterNumber", &pnum) != GRIB_SUCCESS ||
-+	grib_get_long(handle, "discipline", &disc) != GRIB_SUCCESS ||
-+	grib_get_long(handle, "localTablesVersion", &ltabl) != GRIB_SUCCESS ||
-+	grib_get_long(handle, "parameterCategory", &categ) != GRIB_SUCCESS)
-+      rb_raise(rb_eRuntimeError, "connot identify variable");
-+  }
-+  var_list *last = NULL;
-+  var_list *var = pvar[0];
-+  if (var) {
-+    while (var) {
-+      if (var->cent == cent && var->mtabl == mtabl && var->pnum == pnum &&
-+	  var->ni == ni && var->nj == nj &&
-+	  strcmp(var->gtype,gtype)==0 &&
-+	  var->ltype_id==ltype_id) {
-+	if (edition == 1)
-+	  push_msg(var->ary, handle);
-+	else if (edition == 2 &&
-+	    var->disc == disc && var->ltabl == ltabl &&  var->categ == categ)
-+	  push_msg(var->ary, handle);
-+	return;
-+      }
-+      last = var;
-+      var = var->next;
-+    }
-+  }
-+  var_list *var_new = var_list_alloc(file);
-+  if (var_new == NULL)
-+    rb_raise(rb_eRuntimeError, "cannot allocate memory");
-+  var_new->cent = cent;
-+  var_new->mtabl = mtabl;
-+  var_new->pnum = pnum;
-+  if (edition == 2) {
-+    var_new->disc = disc;
-+    var_new->ltabl = ltabl;
-+    var_new->categ = categ;
-+  }
-+  var_new->ni = ni;
-+  var_new->nj = nj;
-+  var_new->ltype_id = ltype_id;
-+  strcpy(var_new->gtype, gtype);
-+
-+  len = MAX_VALUE_LENGTH;
-+  bzero(vname, len);
-+  if (grib_get_string(handle, "shortName", vname, &len) != GRIB_SUCCESS ||
-+      strcmp("unknown", vname) == 0) {
-+    sprintf(vname, "id%ld", pnum);
-+  }
-+  strcpy(var_new->vname, vname);
-+
-+  len = MAX_VALUE_LENGTH;
-+  bzero(vname, len);
-+  check_error(grib_get_string(handle, "typeOfLevel", vname, &len));
-+  if (strcmp(vname, "unknown")==0 || strcmp(vname,"isobaricInhPa")== 0 || strcmp(vname,"pl")==0)
-+    strcpy(var_new->ltype, vname);
-+  else {
-+    int i, j;
-+    var_new->ltype[0] = vname[0];
-+    for (i=1,j=1; i<strlen(vname); i++) {
-+      if (vname[i]>=65 && vname[i]<=90) {
-+	var_new->ltype[j] = vname[i]+32;
-+	j++;
-+      }
-+    }
-+    if (j==1)
-+      strcpy(var_new->ltype, vname);
-+    else
-+      var_new->ltype[j] = 0;
-+  }
-+  push_msg(var_new->ary, handle);
-+  if (last)
-+    last->next = var_new;
-+  else
-+    pvar[0] = var_new;
-+}
-+
-+
-+
-+
-+VALUE cGrib;
-+VALUE cVar;
-+VALUE cMessage;
-+
-+typedef struct {
-+  FILE *file;
-+  char *fname;
-+  var_list *var;
-+} rg_file;
-+typedef struct {
-+  VALUE file;
-+  var_list *var_list;
-+} rg_var;
-+typedef struct {
-+  VALUE file;
-+  grib_handle *handle;
-+} rg_message;
-+
-+
-+static void
-+message_free(rg_message *message)
-+{
-+  if (message) free(message);
-+}
-+static void
-+message_mark(rg_message *message)
-+{
-+  if (message && message->file != Qnil) rb_gc_mark(message->file);
-+}
-+static VALUE
-+message_alloc(VALUE klass)
-+{
-+  rg_message *message = ALLOC(rg_message);
-+  message->file = Qnil;
-+  return Data_Wrap_Struct(klass, message_mark, message_free, message);
-+}
-+static void
-+var_free(rg_var *var)
-+{
-+  if (var) free(var);
-+}
-+static void
-+var_mark(rg_var *var)
-+{
-+  if (var && var->file != Qnil) rb_gc_mark(var->file);
-+}
-+static VALUE
-+var_alloc(VALUE klass)
-+{
-+  rg_var *var = ALLOC(rg_var);
-+  var->file = Qnil;
-+  return Data_Wrap_Struct(klass, var_mark, var_free, var);
-+}
-+static void
-+file_close(rg_file *gfile)
-+{
-+  if (gfile) {
-+    if (gfile->var) {
-+      var_list_free(gfile->var);
-+      gfile->var = NULL;
-+    }
-+    if (gfile->file) {
-+      fclose(gfile->file);
-+      gfile->file = NULL;
-+    }
-+    if (gfile->fname) {
-+      free(gfile->fname);
-+      gfile->fname = NULL;
-+    }
-+  }
-+}
-+static void
-+file_free(rg_file *gfile)
-+{
-+  if (gfile) {
-+    file_close(gfile);
-+    free(gfile);
-+  }
-+}
-+static VALUE
-+file_alloc(VALUE klass)
-+{
-+  rg_file *gfile = ALLOC(rg_file);
-+  gfile->file = NULL;
-+  gfile->fname = NULL;
-+  gfile->var = NULL;
-+  return Data_Wrap_Struct(klass, 0, file_free, gfile);
-+}
-+
-+/*
-+  NumRu::Grib.multi=(flag) -> True/False
-+*/
-+static VALUE
-+rg_multi(VALUE self, VALUE flag)
-+{
-+  if (flag == Qtrue)
-+    grib_multi_support_on(0);
-+  else if (flag == Qfalse)
-+    grib_multi_support_off(0);
-+  else
-+    rb_raise(rb_eArgError, "flag must be true or false");
-+  return flag;
-+}
-+
-+/*
-+  NumRu::Grib#initialize(filename, [, mode])
-+*/
-+static VALUE
-+rg_file_initialize(int argc, VALUE *argv, VALUE self)
-+{
-+  char *fname, *mode;
-+  VALUE rfname, rmode;
-+  rb_scan_args(argc, argv, "11", &rfname, &rmode);
-+  fname = StringValueCStr(rfname);
-+  if (rmode == Qnil)
-+    mode = "r";
-+  else
-+    mode = StringValueCStr(rmode);
-+
-+  FILE *file = fopen(fname, mode);
-+  if (!file)
-+    rb_raise(rb_eRuntimeError, "unable to open file %s", fname);
-+
-+  rg_file *gfile;
-+  Data_Get_Struct(self, rg_file, gfile);
-+  gfile->file = file;
-+  gfile->fname = ALLOC_N(char, strlen(fname)+1);
-+  strcpy(gfile->fname, fname);
-+
-+  int error;
-+  grib_handle *handle;
-+  var_list *var = NULL;
-+  while ((handle = grib_handle_new_from_file(0, file, &error))) {
-+    check_error(error);
-+    if (handle == NULL)
-+      rb_raise(rb_eRuntimeError, "unable to create handle in %s", fname);
-+    push_msg_var(&var, handle, self);
-+  }
-+  gfile->var = var;
-+  var_list *var2;
-+  const char *vname;
-+  char buf[MAX_VALUE_LENGTH];
-+  int first_ltype, first_gtype;
-+  int i;
-+  while (var) {
-+    vname = var->vname;
-+    var2 = var->next;
-+    i = 0;
-+    first_ltype = 1;
-+    first_gtype = 1;
-+    while (var2) {
-+      if (strcmp(var2->vname, vname) == 0) {
-+	if (var->ltype_id != var2->ltype_id) {
-+	  if (first_ltype) {
-+	    if (strcmp(var->ltype,"isobaricInhPa") != 0 && strcmp(var->ltype,"pl") !=0) {
-+	      if (strcmp(var->ltype, "unknown")==0)
-+		sprintf(buf, "%s_level%ld", var->vname, var->ltype_id);
-+	      else
-+		sprintf(buf, "%s_%s", var->vname, var->ltype);
-+	      strcpy(var->vname, buf);
-+	    }
-+	    first_ltype = 0;
-+	  }
-+	  if (strcmp(var2->ltype,"isobaricInhPa") != 0 && strcmp(var2->ltype,"pl") != 0) {
-+	    if (strcmp(var2->ltype, "unknown")==0)
-+	      sprintf(buf, "%s_level%ld", var2->vname, var2->ltype_id);
-+	    else
-+	      sprintf(buf, "%s_%s", var2->vname, var2->ltype);
-+	    strcpy(var2->vname, buf);
-+	  }
-+	} else if (strcmp(var->gtype, var2->gtype) != 0) {
-+	  if (first_gtype) {
-+	    sprintf(buf, "%s_%s", var->vname, var->gtype);
-+	    strcpy(var->vname, buf);
-+	    first_gtype = 0;
-+	  }
-+	  sprintf(buf, "%s_%s", var2->vname, var2->gtype);
-+	  strcpy(var2->vname, buf);
-+	} else {
-+	  if (i==0) {
-+	    sprintf(buf, "%s_%d", var->vname, i);
-+	    strcpy(var->vname, buf);
-+	    i += 1;
-+	  }
-+	  sprintf(buf, "%s_%d", var2->vname, i);
-+	  strcpy(var2->vname, buf);
-+	  i += 1;
-+	}
-+      }
-+      var2 = var2->next;
-+    }
-+    var = var->next;
-+  }
-+  
-+  return self;
-+}
-+/*
-+  NumRu::Grib#close() -> nil
-+ */
-+static VALUE
-+rg_file_close(VALUE self)
-+{
-+  rg_file *gfile;
-+  Data_Get_Struct(self, rg_file, gfile);
-+  file_close(gfile);
-+  return Qnil;
-+}
-+
-+/*
-+  NumRu::Grib#path() -> String
-+*/
-+static VALUE
-+rg_file_path(VALUE self)
-+{
-+  rg_file *gfile;
-+  Data_Get_Struct(self, rg_file, gfile);
-+  return rb_str_new2(gfile->fname);
-+}
-+
-+/*
-+  NumRu::Grib#var_names() -> Array
-+*/
-+static VALUE
-+rg_file_var_names(VALUE self)
-+{
-+  rg_file *gfile;
-+  Data_Get_Struct(self, rg_file, gfile);
-+  VALUE ary = rb_ary_new();
-+  var_list *var = gfile->var;
-+  while (var) {
-+    rb_ary_push(ary, rb_str_new2(var->vname));
-+    var = var->next;
-+  }
-+  return ary;
-+}
-+
-+static VALUE id_init;
-+/*
-+  NumRu::Grib#var(String) -> NumRu::GribVar
-+*/
-+static VALUE
-+rg_file_var(VALUE self, VALUE rvname)
-+{
-+  char *vname = StringValueCStr(rvname);
-+  rg_file *gfile;
-+  Data_Get_Struct(self, rg_file, gfile);
-+  var_list *var_list = gfile->var;
-+  while (var_list) {
-+    if (strcmp(var_list->vname, vname) == 0) {
-+      VALUE rvar = var_alloc(cVar);
-+      rg_var *var;
-+      Data_Get_Struct(rvar, rg_var, var);
-+      var->file = self;
-+      var->var_list = var_list;
-+      rb_funcall(rvar, id_init, 0);
-+      return rvar;
-+    }
-+    var_list = var_list->next;
-+  }
-+  rb_raise(rb_eArgError, "cannot find variable: %s", vname);
-+}
-+
-+/*
-+  NumRu::GribVar#file() -> NumRu::Grib
-+*/
-+static VALUE
-+rg_var_file(VALUE self)
-+{
-+  rg_var *var;
-+  Data_Get_Struct(self, rg_var, var);
-+  return var->file;
-+}
-+
-+/*
-+  NumRu::GribVar#name() -> String
-+*/
-+static VALUE
-+rg_var_name(VALUE self)
-+{
-+  rg_var *var;
-+  Data_Get_Struct(self, rg_var, var);
-+  return rb_str_new2(var->var_list->vname);
-+}
-+
-+/*
-+  NumRu::GribVar#get_messages() -> Array
-+*/
-+static VALUE
-+rg_var_get_messages(VALUE self)
-+{
-+  rg_var *var;
-+  Data_Get_Struct(self, rg_var, var);
-+  var_list *var_list = var->var_list;
-+  size_t len = var_list->ary->len;
-+  VALUE ary = rb_ary_new2(len);
-+  rg_message *message;
-+  VALUE rmessage;
-+  int i;
-+  for (i=0; i<len; i++) {
-+    rmessage = message_alloc(cMessage);
-+    Data_Get_Struct(rmessage, rg_message, message);
-+    message->file = self;
-+    message->handle = get_msg(var_list->ary, i);
-+    rb_ary_store(ary, i, rmessage);
-+  }
-+  return ary;
-+
-+}
-+
-+/*
-+  NumRu::GribMessage#initialize()
-+*/
-+static VALUE
-+rg_message_initialize(VALUE self, VALUE file)
-+{
-+  rg_message *message;
-+  Data_Get_Struct(self, rg_message, message);
-+  message->file = file;
-+  return self;
-+}
-+
-+/*
-+  NumRu::GribMessage#get_keys() -> Array
-+*/
-+static VALUE
-+rg_message_get_keys(int argc, VALUE *argv, VALUE self)
-+{
-+  VALUE rflag, rns;
-+  unsigned long flag = GRIB_KEYS_ITERATOR_SKIP_READ_ONLY || GRIB_KEYS_ITERATOR_SKIP_COMPUTED;
-+  //  unsigned long flag = GRIB_KEYS_ITERATOR_ALL_KEYS;
-+  char *name_space = NULL;
-+  rb_scan_args(argc, argv, "02", &rflag, &rns);
-+  if (rflag != Qnil) flag = NUM2ULONG(rflag);
-+  if (rns != Qnil) name_space = StringValueCStr(rns);
-+    
-+  rg_message *message;
-+  Data_Get_Struct(self, rg_message, message);
-+  grib_keys_iterator *ki = NULL;
-+  ki = grib_keys_iterator_new(message->handle, flag, name_space);
-+  if (!ki)
-+    rb_raise(rb_eRuntimeError, "unable to create key iterator");
-+  VALUE keys = rb_ary_new();
-+  while (grib_keys_iterator_next(ki)) {
-+    const char *name = grib_keys_iterator_get_name(ki);
-+    rb_ary_push(keys, rb_str_new2(name));
-+  }
-+  grib_keys_iterator_delete(ki);
-+  return keys;
-+}
-+
-+/*
-+  NumRu::GribMessage#get_value(name [,type]) -> String
-+*/
-+static VALUE
-+rg_message_get_value(int argc, VALUE *argv, VALUE self)
-+{
-+  VALUE rname, rtype;
-+  rb_scan_args(argc, argv, "11", &rname, &rtype);
-+  char *name = StringValueCStr(rname);
-+  int type;
-+  rg_message *message;
-+  Data_Get_Struct(self, rg_message, message);
-+  if (rtype == Qnil)
-+    grib_get_native_type(message->handle, name, &type);
-+  else
-+    type = NUM2INT(rtype);
-+  size_t len;
-+  VALUE ret = Qnil;
-+  grib_get_size(message->handle, name, &len);
-+  switch (type) {
-+  case GRIB_TYPE_UNDEFINED:
-+  case GRIB_TYPE_STRING:
-+  case GRIB_TYPE_LABEL:
-+    {
-+      char value[MAX_VALUE_LENGTH];
-+      len = MAX_VALUE_LENGTH;
-+      bzero(value, len);
-+      if (grib_get_string(message->handle, name, value, &len) == GRIB_SUCCESS) {
-+	if (value[len-1] == '\0') len--;
-+	ret = rb_str_new(value, len);
-+      }
-+    }
-+    break;
-+  case GRIB_TYPE_BYTES:
-+    {
-+      unsigned char value[MAX_VALUE_LENGTH];
-+      len = MAX_VALUE_LENGTH;
-+      bzero(value, len);
-+      if (grib_get_bytes(message->handle, name, value, &len) == GRIB_SUCCESS)
-+	ret = rb_str_new((char*)value, len);
-+    }
-+    break;
-+  case GRIB_TYPE_LONG:
-+    {
-+      if (len == 1) {
-+	long l;
-+	if (rtype == Qnil) {
-+	  char value[MAX_VALUE_LENGTH];
-+	  len = MAX_VALUE_LENGTH;
-+	  bzero(value, len);
-+	  if (grib_get_string(message->handle, name, value, &len) == GRIB_SUCCESS) {
-+	    check_error(grib_get_long(message->handle, name, &l));
-+	    if (atol(value) == l)
-+	      ret = LONG2NUM(l);
-+	    else
-+	      ret = rb_str_new2(value);
-+	  }
-+	} else {
-+	  check_error(grib_get_long(message->handle, name, &l));
-+	  ret = LONG2NUM(l);
-+	}	  
-+      } else {
-+	int shape[1];
-+	struct NARRAY *nary;
-+	shape[0] = len;
-+	VALUE rnary = na_make_object(NA_LINT, 1, shape, cNArray);
-+	GetNArray(rnary, nary);
-+	if (grib_get_long_array(message->handle, name, (long*)nary->ptr, &len) == GRIB_SUCCESS)
-+	  ret = rnary;
-+      }
-+    }
-+    break;
-+  case GRIB_TYPE_DOUBLE:
-+    {
-+      if (len == 1) {
-+	double value;
-+	if (grib_get_double(message->handle, name, &value) == GRIB_SUCCESS)
-+	  ret = rb_float_new(value);
-+      } else {
-+	int shape[1];
-+	struct NARRAY *nary;
-+	shape[0] = len;
-+	VALUE rnary = na_make_object(NA_DFLOAT, 1, shape, cNArray);
-+	GetNArray(rnary, nary);
-+	if (grib_get_double_array(message->handle, name, (double*)nary->ptr, &len) == GRIB_SUCCESS)
-+	  ret = rnary;
-+      }
-+    }
-+    break;
-+  default:
-+    rb_raise(rb_eArgError, "type is invalid: %d", type);
-+  }
-+  return ret;
-+}
-+
-+/*
-+  NumRu::GribMessage#get_data() -> [lon, lat, value]
-+*/
-+static VALUE
-+rg_message_get_data(VALUE self)
-+{
-+  rg_message *message;
-+  Data_Get_Struct(self, rg_message, message);
-+  int error;
-+  grib_iterator *iter = grib_iterator_new(message->handle, 0, &error);
-+  check_error(error);
-+  long np;
-+  check_error(grib_get_long(message->handle, "numberOfPoints", &np));
-+  double *lon, *lat, *value;
-+  VALUE na_lon, na_lat, na_value;
-+  struct NARRAY *nary;
-+  int shape[1];
-+  shape[0] = np;
-+  na_lon = na_make_object(NA_DFLOAT, 1, shape, cNArray);
-+  GetNArray(na_lon, nary);
-+  lon = (double*) nary->ptr;
-+  na_lat = na_make_object(NA_DFLOAT, 1, shape, cNArray);
-+  GetNArray(na_lat, nary);
-+  lat = (double*) nary->ptr;
-+  na_value = na_make_object(NA_DFLOAT, 1, shape, cNArray);
-+  GetNArray(na_value, nary);
-+  value = (double*) nary->ptr;
-+  int n = 0;
-+  double lo, la, val;
-+  while( grib_iterator_next(iter, &la, &lo, &val) ) {
-+    lat[n] = la;
-+    lon[n] = lo;
-+    value[n] = val;
-+    n++;
-+  }
-+  grib_iterator_delete(iter);
-+  return rb_ary_new3(3, na_lon, na_lat, na_value);
-+}
-+
-+
-+
-+void Init_grib()
-+{
-+  rb_require("narray");
-+
-+  id_init = rb_intern("init");
-+
-+  VALUE mNumRu = rb_define_module("NumRu");
-+  cGrib = rb_define_class_under(mNumRu, "Grib", rb_cObject);
-+  cVar = rb_define_class_under(mNumRu, "GribVar", rb_cObject);
-+  cMessage = rb_define_class_under(mNumRu, "GribMessage", rb_cObject);
-+
-+  grib_multi_support_on(0);
-+
-+  //rb_define_singleton_method(cGrib, "open", rg_open, -1);
-+  rb_define_singleton_method(cGrib, "multi=", rg_multi, 1);
-+
-+  rb_define_alloc_func(cGrib, file_alloc);
-+  rb_define_method(cGrib, "initialize", rg_file_initialize, -1);
-+  rb_define_method(cGrib, "close", rg_file_close, 0);
-+  rb_define_method(cGrib, "path", rg_file_path, 0);
-+  rb_define_method(cGrib, "var_names", rg_file_var_names, 0);
-+  rb_define_method(cGrib, "var", rg_file_var, 1);
-+
-+  rb_define_alloc_func(cVar, var_alloc);
-+  rb_define_method(cVar, "file", rg_var_file, 0);
-+  rb_define_method(cVar, "name", rg_var_name, 0);
-+  rb_define_method(cVar, "get_messages", rg_var_get_messages, 0);
-+
-+
-+  rb_define_alloc_func(cMessage, message_alloc);
-+  rb_define_method(cMessage, "initialize", rg_message_initialize, 1);
-+  rb_define_method(cMessage, "get_keys", rg_message_get_keys, -1);
-+  rb_define_method(cMessage, "get_value", rg_message_get_value, -1);
-+  rb_define_method(cMessage, "get_data", rg_message_get_data, 0);
-+
-+  rb_define_const(cGrib, "TYPE_UNDEFINED", INT2NUM(GRIB_TYPE_UNDEFINED));
-+  rb_define_const(cGrib, "TYPE_LONG", INT2NUM(GRIB_TYPE_LONG));
-+  rb_define_const(cGrib, "TYPE_DOUBLE", INT2NUM(GRIB_TYPE_DOUBLE));
-+  rb_define_const(cGrib, "TYPE_STRING", INT2NUM(GRIB_TYPE_STRING));
-+  rb_define_const(cGrib, "TYPE_BYTES", INT2NUM(GRIB_TYPE_BYTES));
-+  rb_define_const(cGrib, "TYPE_SECTION", INT2NUM(GRIB_TYPE_SECTION));
-+  rb_define_const(cGrib, "TYPE_LABEL", INT2NUM(GRIB_TYPE_LABEL));
-+  rb_define_const(cGrib, "TYPE_MISSING", INT2NUM(GRIB_TYPE_MISSING));
-+
-+  rb_define_const(cGrib, "NEAREST_SAME_GRID", ULONG2NUM(GRIB_NEAREST_SAME_GRID));
-+  rb_define_const(cGrib, "NEAREST_SAME_DATA", ULONG2NUM(GRIB_NEAREST_SAME_DATA));
-+  rb_define_const(cGrib, "NEAREST_SAME_POINT", ULONG2NUM(GRIB_NEAREST_SAME_POINT));
-+
-+  rb_define_const(cGrib, "KEYS_ITERATOR_ALL_KEYS", ULONG2NUM(GRIB_KEYS_ITERATOR_ALL_KEYS));
-+  rb_define_const(cGrib, "KEYS_ITERATOR_SKIP_READ_ONLY", ULONG2NUM(GRIB_KEYS_ITERATOR_SKIP_READ_ONLY));
-+}
-diff --git a/metadata.yml b/metadata.yml
-index fc91f7b..2c99e9d 100644
---- a/metadata.yml
-+++ b/metadata.yml
-@@ -65,7 +65,7 @@ email:
- executables: []
- 
- extensions: 
--- ext/extconf.rb
-+- ext/numru/extconf.rb
- extra_rdoc_files: []
- 
- files: 
-@@ -89,8 +89,8 @@ files:
- - data/regular_latlon_surface_constant.grib2
- - data/regular_latlon_surface_prec.grib1
- - data/tp_ecmwf.grib
--- ext/extconf.rb
--- ext/grib.c
-+- ext/numru/extconf.rb
-+- ext/numru/grib.c
- - lib/numru/grib.rb
- - lib/numru/grib/definitions/grib1/localConcepts/kwbc/name.def
- - lib/numru/grib/definitions/grib1/localConcepts/kwbc/paramId.def
-diff --git a/rb-grib.gemspec b/rb-grib.gemspec
-index 52c0012..cf19d77 100644
---- a/rb-grib.gemspec
-+++ b/rb-grib.gemspec
-@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
-   s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
-   s.executables   = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
-   s.require_paths = ["lib"]
--  s.extensions << "ext/extconf.rb"
-+  s.extensions << "ext/numru/extconf.rb"
- 
-   # specify any dependencies here; for example:
-   s.add_development_dependency "rspec"
-diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
-index a9cc64a..732b42e 100644
---- a/spec/spec_helper.rb
-+++ b/spec/spec_helper.rb
-@@ -1,8 +1 @@
--$LOAD_PATH.unshift File.expand_path(File.join('..','ext'), File.dirname(__FILE__))
--$LOAD_PATH.unshift File.expand_path(File.join('..','lib'), File.dirname(__FILE__))
--alias :_require :require
--def require(arg)
--  arg = "grib.so" if arg == "numru/grib.so"
--  _require(arg)
--end
- require "numru/grib"
diff --git a/debian/patches/series b/debian/patches/series
index d06f5c8..55ec084 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,2 +1,2 @@
-0001-Ad-hoc-fix-Hardening.patch
-0002-Fix-ext-library-location.patch
+0001-Fix-RSpec-LOAD_PATH.patch
+0002-Ad-hoc-fix-Hardening.patch

-- 
ruby-grib.git



More information about the Pkg-ruby-extras-commits mailing list