/*
* inquire control information
*
* inq_cntl(type1, type2, type3, basetime, member, validtime, param)
* arguments:
* type1, type2, type3, member: String
* basetime, validtime: Integer (minuits from 00:00 1 Jan 1801)
* param: Integer
* NuSDaS::N_MEMBER_NUM : number of members
* NuSDaS::N_MEMBER_LIST : list of members
* NuSDaS::N_VALIDTIME_NUM : number of validtimes
* NuSDaS::N_VALIDTIME_LIST : list of validtime
* NuSDaS::N_VALIDTIME_LIST2 : list of validtime2
* NuSDaS::N_PLANE_NUM : number of planes
* NuSDaS::N_PLANE_LIST : list of planes
* NuSDaS::N_ELEMENT_NUM : number of elements
* NuSDaS::N_ELEMENT_LIST : list of elements
* NuSDaS::N_PROJECTION : projection
* return:
* result
*/
VALUE
rb_inq_cntl(VALUE self,
VALUE type1, VALUE type2, VALUE type3,
VALUE basetime, VALUE member, VALUE validtime,
VALUE param)
{
GetTypes;
GetTimesAndMember;
VALUE data;
N_SI4 cparam;
void* cdata;
N_SI4 cdatasize;
N_SI4 cparam2, len;
int flag, i;
N_SI4 code;
cparam = (N_SI4)NUM2INT(param);
cparam2 = 0;
flag = -1;
len = 0;
switch( cparam ) {
case N_MEMBER_NUM:
case N_VALIDTIME_NUM:
case N_PLANE_NUM:
case N_ELEMENT_NUM:
cdatasize = 1;
cdata = xmalloc( sizeof(N_SI4) );
flag = 1;
break;
case N_MEMBER_LIST:
case N_VALIDTIME_LIST:
case N_PLANE_LIST:
case N_ELEMENT_LIST:
switch( cparam ) {
case N_MEMBER_LIST:
cparam2 = N_MEMBER_NUM;
len = 4;
flag = 2;
break;
case N_VALIDTIME_LIST:
cparam2 = N_VALIDTIME_NUM;
len = 4;
flag = 4;
break;
case N_PLANE_LIST:
cparam2 = N_PLANE_NUM;
len = 6;
flag = 2;
break;
case N_ELEMENT_LIST:
cparam2 = N_ELEMENT_NUM;
len = 6;
flag = 2;
break;
}
cdatasize = 1;
cdata = xmalloc(4);
code = nusdas_inq_cntl(ctype1, ctype2, ctype3,
&cbasetime, cmember, &cbasetime,
cparam2, cdata, &cdatasize);
if (code == 1)
cdatasize = ((N_SI4*)cdata)[0];
else 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
rb_raise(rb_eRuntimeError, "failed: nusdas_inq_cntl, code=%d",code);
free(cdata);
cdata = xmalloc( sizeof(char)*len*cdatasize );
break;
case N_PROJECTION:
cdatasize = 1;
cdata = xmalloc( sizeof(char)*4 );
flag = 3;
break;
default:
rb_raise(rb_eArgError, "param is invalid");
}
code = nusdas_inq_cntl(ctype1, ctype2, ctype3,
&cbasetime, cmember, &cvalidtime,
cparam, cdata, &cdatasize);
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 != cdatasize)
rb_raise(rb_eRuntimeError, "failed: nusdas_inq_cntl, code=%d",code);
switch (flag) {
case 1:
data = INT2NUM( ((int*)cdata)[0] );
break;
case 2:
data = rb_ary_new();
for (i=0;i<cdatasize;i++)
rb_ary_push(data, rb_str_new(((char*)cdata)+i*len, len));
break;
case 3:
data = rb_str_new((char*)cdata, 4);
break;
case 4:
data = rb_ary_new();
for (i=0;i<cdatasize;i++)
rb_ary_push(data, INT2NUM((int)(((N_SI4*)cdata)[i])));
break;
data = INT2NUM( (int)(((N_SI4*)cdata)[0]) );
break;
default:
data = Qnil;
}
free(cdata);
return data;
}