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; }
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; }