static grib_trie* load_list(grib_context* c,grib_expression* e, int* err) {

  grib_expression_is_in_list* self = (grib_expression_is_in_list*)e;

  char* filename=NULL;
  char line[1024]={0,};
  grib_trie* list=NULL;
  FILE* f=NULL;

  *err=GRIB_SUCCESS;

  filename=grib_context_full_defs_path(c,self->list);
  if (!filename) {
    grib_context_log(c,GRIB_LOG_ERROR,"unable to find def file %s",self->list);
    *err=GRIB_FILE_NOT_FOUND;
    return NULL;
  } else {
    grib_context_log(c,GRIB_LOG_DEBUG,"found def file %s",filename);
  }
  list=(grib_trie*)grib_trie_get(c->lists,filename);
  if (list) {
	grib_context_log(c,GRIB_LOG_DEBUG,"using list %s from cache",self->list);
  	return list;
  } else {
	grib_context_log(c,GRIB_LOG_DEBUG,"using list %s from file %s",self->list,filename);
  }

  f=codes_fopen(filename,"r");
  if (!f) {*err=GRIB_IO_PROBLEM; return NULL;}

  list=grib_trie_new(c);

  while(fgets(line,sizeof(line)-1,f)) {
	unsigned char* p=(unsigned char*)line;
	while (*p!=0) {
		if (*p<33) {*p=0; break;}
		p++;
	}
  	grib_trie_insert(list,line,line);
  }

  grib_trie_insert(c->lists,filename,list);

  fclose(f);

  return list;

}
Example #2
0
grib_context* grib_context_get_default(){
	GRIB_PTHREAD_ONCE(&once,&init);
	GRIB_MUTEX_LOCK(&mutex_c);

	if(!default_grib_context.inited)
	{
		const char * write_on_fail = getenv("GRIB_API_WRITE_ON_FAIL");
		const char * large_constant_fields = getenv("GRIB_API_LARGE_CONSTANT_FIELDS");
		const char * no_abort = getenv("GRIB_API_NO_ABORT");
		const char * debug = getenv("GRIB_API_DEBUG");
		const char *gribex=getenv("GRIB_GRIBEX_MODE_ON");
		const char *ieee_packing=getenv("GRIB_IEEE_PACKING");
		const char *io_buffer_size=getenv("GRIB_API_IO_BUFFER_SIZE");
		const char *log_stream=getenv("GRIB_API_LOG_STREAM");
		const char *no_big_group_split=getenv("GRIB_API_NO_BIG_GROUP_SPLIT");
		const char *no_spd=getenv("GRIB_API_NO_SPD");
		const char *keep_matrix=getenv("GRIB_API_KEEP_MATRIX");
		default_grib_context.inited = 1;
		default_grib_context.io_buffer_size = io_buffer_size ? atoi(io_buffer_size) : 0;
		default_grib_context.no_big_group_split = no_big_group_split ? atoi(no_big_group_split) : 0;
		default_grib_context.no_spd = no_spd ? atoi(no_spd) : 0;
		default_grib_context.keep_matrix = keep_matrix ? atoi(keep_matrix) : 1;
		default_grib_context.write_on_fail  = write_on_fail ? atoi(write_on_fail) : 0;
		default_grib_context.no_abort  = no_abort ? atoi(no_abort) : 0;
		default_grib_context.debug  = debug ? atoi(debug) : 0;
		default_grib_context.gribex_mode_on=gribex ? atoi(gribex) : 0;
		default_grib_context.large_constant_fields = large_constant_fields ? atoi(large_constant_fields) : 0;
		default_grib_context.ieee_packing=ieee_packing ? atoi(ieee_packing) : 0;
		default_grib_context.grib_templates_path = getenv("GRIB_SAMPLES_PATH");
		default_grib_context.log_stream=stderr;
		if (!log_stream) { 
			default_grib_context.log_stream=stderr;
		} else if (!strcmp(log_stream,"stderr") ) {
			default_grib_context.log_stream=stderr;
		} else if (!strcmp(log_stream,"stdout") ) {
			default_grib_context.log_stream=stdout;
		} 

		if (!default_grib_context.grib_templates_path)
			default_grib_context.grib_templates_path = getenv("GRIB_TEMPLATES_PATH");
#ifdef GRIB_TEMPLATES_PATH
		if(!default_grib_context.grib_templates_path)
			default_grib_context.grib_templates_path = GRIB_TEMPLATES_PATH ;
#endif
		default_grib_context.grib_definition_files_path = getenv("GRIB_DEFINITION_PATH");
#ifdef GRIB_DEFINITION_PATH
		if(!default_grib_context.grib_definition_files_path)
			default_grib_context.grib_definition_files_path = GRIB_DEFINITION_PATH ;
#endif
		default_grib_context.keys_count=0;
		default_grib_context.keys=grib_hash_keys_new(&(default_grib_context),
				&(default_grib_context.keys_count));

		default_grib_context.concepts_index=grib_itrie_new(&(default_grib_context),
				&(default_grib_context.concepts_count));
		default_grib_context.def_files=grib_trie_new(&(default_grib_context));
		default_grib_context.classes=grib_trie_new(&(default_grib_context));
	}


	GRIB_MUTEX_UNLOCK(&mutex_c);

	return &default_grib_context;
}
static grib_trie* load_dictionary(grib_context* c,grib_accessor* a, int* err)
{
    grib_accessor_dictionary* self = (grib_accessor_dictionary*)a;

    char* filename=NULL;
    char line[1024]={0,};
    char key[1024]={0,};
    char masterDir[1024]={0,};
    char localDir[1024]={0,};
    char dictName[1024]={0,};
    char *localFilename=0;
    char* list=0;
    size_t len=1024;
    grib_trie* dictionary=NULL;
    FILE* f=NULL;
    int i=0;
    grib_handle* h=grib_handle_of_accessor(a);

    *err=GRIB_SUCCESS;

    len=1024;
    if (self->masterDir != NULL) grib_get_string(h,self->masterDir,masterDir,&len);
    len=1024;
    if (self->localDir != NULL) grib_get_string(h,self->localDir,localDir,&len);

    if (*masterDir!=0) {
        char name[1024]={0,};
        char recomposed[1024]={0,};
        sprintf(name,"%s/%s",masterDir,self->dictionary);
        grib_recompose_name(h, NULL,name, recomposed,0);
        filename=grib_context_full_defs_path(c,recomposed);
    } else {
        filename=grib_context_full_defs_path(c,self->dictionary);
    }

    if (*localDir!=0) {
        char localName[1024]={0,};
        char localRecomposed[1024]={0,};
        sprintf(localName,"%s/%s",localDir,self->dictionary);
        grib_recompose_name(h, NULL,localName, localRecomposed,0);
        localFilename=grib_context_full_defs_path(c,localRecomposed);
        sprintf(dictName,"%s:%s",localFilename,filename);
    } else {
        sprintf(dictName,"%s",filename);
    }

    if (!filename) {
        grib_context_log(c,GRIB_LOG_ERROR,"unable to find def file %s",self->dictionary);
        *err=GRIB_FILE_NOT_FOUND;
        return NULL;
    } else {
        grib_context_log(c,GRIB_LOG_DEBUG,"found def file %s",filename);
    }
    dictionary=(grib_trie*)grib_trie_get(c->lists,dictName);
    if (dictionary) {
        grib_context_log(c,GRIB_LOG_DEBUG,"using dictionary %s from cache",self->dictionary);
        return dictionary;
    } else {
        grib_context_log(c,GRIB_LOG_DEBUG,"using dictionary %s from file %s",self->dictionary,filename);
    }

    f=codes_fopen(filename,"r");
    if (!f) {*err=GRIB_IO_PROBLEM; return NULL;}

    dictionary=grib_trie_new(c);

    while(fgets(line,sizeof(line)-1,f)) {
        i=0;
        while (line[i] != '|' && line[i] != 0)  {
            key[i]=line[i];
            i++;
        }
        key[i]=0;
        list=(char*)grib_context_malloc_clear(c,strlen(line)+1);
        memcpy(list,line,strlen(line));
        grib_trie_insert(dictionary,key,list);
    }

    fclose(f);

    if (localFilename!=0) {
        f=codes_fopen(localFilename,"r");
        if (!f) {*err=GRIB_IO_PROBLEM; return NULL;}

        while(fgets(line,sizeof(line)-1,f)) {
            i=0;
            while (line[i] != '|' && line[i] != 0)  {
                key[i]=line[i];
                i++;
            }
            key[i]=0;
            list=(char*)grib_context_malloc_clear(c,strlen(line)+1);
            memcpy(list,line,strlen(line));
            grib_trie_insert(dictionary,key,list);
        }


        fclose(f);
    }
    grib_trie_insert(c->lists,filename,dictionary);
    return dictionary;
}