/*
* inquire data information
*
inq_data(type1, type2, type3, basetime, member, validtime, plane, element, param)
* arguments:
* type1, type2, type3, member, plane, element: String
* basetime, validtime: Integer (minuits from 00:00 1 Jan 1801)
* param: Integer
* NuSDaS::N_GRID_SIZE
* NuSDaS::N_PC_PACKING
* NuSDaS::N_MISSING_MODE
* NuSDaS::N_MISSING_VALUE
* return:
* result
*/
VALUE
rb_inq_data(VALUE self,
VALUE type1, VALUE type2, VALUE type3,
VALUE basetime, VALUE member, VALUE validtime,
VALUE plane, VALUE element,
VALUE param)
{
GetFullParams;
VALUE data;
N_SI4 cparam, cnelems;
void* cdata;
int flag;
int code;
int len;
cparam = (N_SI4)NUM2INT(param);
switch(cparam) {
case N_GRID_SIZE:
cdata = xmalloc(4*2);
cnelems = 2;
flag = 1;
break;
case N_PC_PACKING:
case N_MISSING_MODE:
cdata = xmalloc(4);
cnelems = 1;
flag = 2;
break;
case N_MISSING_VALUE:
cdata = xmalloc(4);
cnelems = 1;
code = nusdas_inq_data(ctype1, ctype2, ctype3,
&cbasetime, cmember, &cvalidtime,
cplane, celement,
N_PC_PACKING, cdata, &cnelems);
if ( code == -1 )
rb_raise(rb_eRuntimeError, "bug");
else if ( code == -2 )
rb_raise(rb_eRuntimeError, "bug");
else if ( code == -3 )
rb_raise(rb_eRuntimeError, "bug");
else if ( code != 1 )
rb_raise(rb_eRuntimeError, "bug");
if ( strncmp((char*)cdata,"1PAC",4) == 0 ){
len = 1;
flag = 3;
} else if ( strncmp((char*)cdata,"2PAC",4) == 0 ) {
len = 2;
flag = 4;
} else if ( strncmp((char*)cdata,"2UPC",4) == 0 ) {
len = 2;
flag = 5;
} else if ( strncmp((char*)cdata,"4PAC",4) == 0 ) {
len = 4;
flag = 6;
} else if ( strncmp((char*)cdata,"N1I2",4) == 0 ) {
len = 2;
flag = 4;
} else if ( strncmp((char*)cdata,"I1 ",4) == 0 ) {
len = 1;
flag = 3;
} else if ( strncmp((char*)cdata,"I2 ",4) == 0 ) {
len = 2;
flag = 4;
} else if ( strncmp((char*)cdata,"I4 ",4) == 0 ) {
len = 4;
flag = 7;
} else if ( strncmp((char*)cdata,"R4 ",4) == 0 ) {
len = 4;
flag = 8;
} else if ( strncmp((char*)cdata,"R8 ",4) == 0 ) {
len = 8;
flag = 9;
} else {
len = -1;
flag = -1;
rb_raise(rb_eRuntimeError, "bug");
}
free(cdata);
cdata = xmalloc(len);
cnelems = 1;
break;
default:
flag = -1;
cdata = NULL;
rb_raise(rb_eArgError, "param is invalid");
}
code = nusdas_inq_data(ctype1, ctype2, ctype3,
&cbasetime, cmember, &cvalidtime,
cplane, celement,
cparam, cdata, &cnelems);
if ( code == -1 )
rb_raise(rb_eRuntimeError, "bug");
else if ( code == -2 )
rb_raise(rb_eRuntimeError, "bug");
else if ( code == -3 )
rb_raise(rb_eRuntimeError, "param is invalid");
else if ( code != cnelems )
rb_raise(rb_eRuntimeError, "bug");
switch (flag) {
case 1:
data = rb_ary_new();
rb_ary_push(data, INT2NUM((int)((N_SI4*)cdata)[0]));
rb_ary_push(data, INT2NUM((int)((N_SI4*)cdata)[1]));
break;
case 2:
data = rb_str_new((char*)cdata, 4);
break;
case 3:
data = CHR2FIX( ((N_UI1*)cdata)[0] );
break;
case 4:
data = INT2FIX( ((N_SI2*)cdata)[0] );
break;
case 5:
data = UINT2NUM( (unsigned int)(((N_UI2*)cdata)[0]) );
break;
case 6:
data = INT2FIX( ((N_SI4*)cdata)[0] );
break;
case 7:
data = UINT2NUM( (unsigned int)(((N_UI4*)cdata)[0]) );
break;
case 8:
data = rb_float_new( (double)(((float*)cdata)[0]) );
break;
case 9:
data = rb_float_new( ((double*)cdata)[0] );
break;
default:
data = Qnil;
}
free(cdata);
return data;
}