mirror of https://github.com/ecmwf/eccodes.git
224 lines
3.8 KiB
C
224 lines
3.8 KiB
C
#include "test.h"
|
|
|
|
char buffer[1024*1024*10];
|
|
double values[1024*1024*10];
|
|
|
|
long cnt = 0;
|
|
long ff = 0;
|
|
long m = 0;
|
|
|
|
void* foo[1000000] = {0,};
|
|
|
|
static void default_free(const grib_context* c, void* p) {
|
|
|
|
#if 0
|
|
int i, found = 0;
|
|
|
|
for(i = 0; i < m; i++)
|
|
if(foo[i] == p)
|
|
{
|
|
foo[i] = 0;
|
|
found = 1;
|
|
}
|
|
|
|
if(!found) marslog(LOG_EXIT,"Wrong free called %p",p);
|
|
#endif
|
|
|
|
ff++;
|
|
cnt--;
|
|
free(p);
|
|
}
|
|
|
|
static void* default_malloc(const grib_context* c, size_t size) {
|
|
cnt++;
|
|
#if 0
|
|
if(m == NUMBER(foo)) marslog(LOG_EXIT,"Too many malloc");
|
|
return foo[m++] = malloc(size);
|
|
#else
|
|
return malloc(size);
|
|
#endif
|
|
}
|
|
|
|
|
|
int main(int argc,char** argv)
|
|
{
|
|
long length = 0;
|
|
FILE *f;
|
|
grib_handle *g = 0;
|
|
int e;
|
|
grib_iterator* i;
|
|
double lat,lon,val;
|
|
int n;
|
|
size_t count;
|
|
size_t fields1 = 0;
|
|
size_t fields2 = 0;
|
|
grib_handle* p;
|
|
FILE* dev_null = fopen("/dev/null","w");
|
|
|
|
grib_context *c = grib_context_new(0);
|
|
|
|
|
|
f = fopen(argc > 1 ? argv[1]: "data" ,"r");
|
|
if(!f)
|
|
{
|
|
perror(argc > 1 ? argv[1]: "data");
|
|
exit(1);
|
|
}
|
|
|
|
length = sizeof(buffer);
|
|
|
|
grib_context_set_memory_proc(c,default_malloc,default_free);
|
|
grib_context_set_persistent_memory_proc(c,default_malloc,default_free);
|
|
|
|
while( (e = readany(f,buffer,&length)) == 0)
|
|
{
|
|
|
|
/* alarm(60); */
|
|
fields1++;
|
|
|
|
if(fields1 != 1)
|
|
{
|
|
length = sizeof(buffer);
|
|
alarm(0);
|
|
continue;
|
|
}
|
|
|
|
g = grib_handle_new_from_message(c,buffer,length);
|
|
p = grib_handle_new_from_message_copy(c,buffer,length);
|
|
|
|
grib_dump_content(g,dev_null,NULL,0,NULL);
|
|
|
|
i = grib_iterator_new(g);
|
|
|
|
if(i != NULL)
|
|
{
|
|
|
|
n = 0;
|
|
while(grib_iterator_next(i,&lat,&lon,&val))
|
|
{
|
|
n++;
|
|
}
|
|
|
|
|
|
grib_iterator_delete(i);
|
|
|
|
/* printf("n = %d\n",n); if(n != size) exit(1); */
|
|
|
|
}
|
|
|
|
count = 0;
|
|
if(grib_get_size(g,"values",&count) == 0 && count != 0)
|
|
{
|
|
double *values = (double*)malloc(sizeof(double)*count);
|
|
int err;
|
|
|
|
if((err = grib_get_double_array(g,"values",values,&count)))
|
|
{
|
|
fprintf(stderr,"Cannot get values %d (%s) count=%d\n",err,grib_get_error_message(err),count);
|
|
}
|
|
free(values);
|
|
}
|
|
|
|
|
|
{
|
|
grib_handle *h = grib_handle_clone(g);
|
|
grib_keyset* ks = grib_new_keyset(h,"mars.*");
|
|
char name[80];
|
|
size_t len = sizeof(name);
|
|
int err;
|
|
|
|
while(grib_keyset_next(ks,name,&len))
|
|
{
|
|
double d; long l; char c[1024]; unsigned char b[1024];
|
|
printf("%s\n",name);
|
|
|
|
if((err = grib_get_double(h,name,&d)))
|
|
fprintf(stderr,"Cannot get %s as double %d (%s)\n",name,err,
|
|
grib_get_error_message(err));
|
|
|
|
if((err = grib_get_long(h,name,&l)))
|
|
fprintf(stderr,"Cannot get %s as long %d (%s)\n",name,err,
|
|
grib_get_error_message(err));
|
|
|
|
len = sizeof(c);
|
|
if((err = grib_get_string(h,name,c,&len)))
|
|
fprintf(stderr,"Cannot get %s as string %d (%s)\n",name,err,
|
|
grib_get_error_message(err));
|
|
|
|
len = sizeof(b);
|
|
if((err = grib_get_bytes(h,name,b,&len)))
|
|
fprintf(stderr,"Cannot get %s as bytes %d (%s)\n",name,err,
|
|
grib_get_error_message(err));
|
|
|
|
|
|
len = sizeof(name);
|
|
}
|
|
|
|
grib_keyset_delete(ks);
|
|
grib_handle_delete(h);
|
|
|
|
}
|
|
|
|
|
|
grib_handle_delete(g);
|
|
grib_handle_delete(p);
|
|
|
|
|
|
length = sizeof(buffer);
|
|
}
|
|
|
|
|
|
|
|
rewind(f);
|
|
while((g = grib_handle_new_from_file(c,f,&e)))
|
|
{
|
|
|
|
int i;
|
|
|
|
fields2++;
|
|
|
|
|
|
for(i=1;i<10;i++)
|
|
grib_set_long(g,"localDefinitionNumber",i);
|
|
|
|
grib_handle_delete(g);
|
|
}
|
|
|
|
if(e) {
|
|
fprintf(stderr,"grib_handle_new_from_file error %s\n",grib_get_error_message(e));
|
|
exit(1);}
|
|
|
|
if(fields1 != fields2)
|
|
{
|
|
fprintf(stderr,"readany/grib_handle_new_from_file mismatch %d %d\n",fields1,fields2);
|
|
exit(1);
|
|
}
|
|
|
|
grib_handle_delete(grib_handle_new_from_template(c,"latlon"));
|
|
|
|
rewind(f);
|
|
|
|
|
|
|
|
grib_context_delete(c);
|
|
|
|
if(cnt != 0)
|
|
{
|
|
fprintf(stderr,"Malloc/free mismatch %ld\n",cnt);
|
|
exit(1);
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
if(e != -1)
|
|
{
|
|
fprintf(stderr,"readany error %d\n",e);
|
|
exit(1);
|
|
}
|
|
|
|
fclose(dev_null);
|
|
|
|
exit(cnt);
|
|
|
|
}
|