char *grib_context_full_path(grib_context* c,const char* basename) { int err=0; char full[1024]={0,}; grib_string_list* dir=NULL; grib_string_list* fullpath=0; if (!c) c=grib_context_get_default(); GRIB_PTHREAD_ONCE(&once,&init); GRIB_MUTEX_LOCK(&mutex_c); if(*basename == '/' || *basename == '.') { GRIB_MUTEX_UNLOCK(&mutex_c); return (char*)basename; } else { if ((fullpath=grib_trie_get(c->def_files,basename))!=NULL) { GRIB_MUTEX_UNLOCK(&mutex_c); return fullpath->value; } if (!c->grib_definition_files_dir) err=init_definition_files_dir(c); if (err != GRIB_SUCCESS) { grib_context_log(c,GRIB_LOG_ERROR, "Unable to find definition files directory"); GRIB_MUTEX_UNLOCK(&mutex_c); return NULL; } dir=c->grib_definition_files_dir; while (dir) { sprintf(full,"%s/%s",dir->value,basename); if (!access(full,F_OK)) { fullpath=grib_context_malloc_clear_persistent(c,sizeof(grib_string_list)); Assert(fullpath); fullpath->value=grib_context_strdup(c,full); grib_trie_insert(c->def_files,basename,fullpath); grib_context_log(c,GRIB_LOG_DEBUG,"Found def file %s",full); GRIB_MUTEX_UNLOCK(&mutex_c); return fullpath->value; } dir=dir->next; } } /* Store missing files so we don't check for them again and again */ grib_trie_insert(c->def_files,basename,&grib_file_not_found); /*grib_context_log(c,GRIB_LOG_ERROR,"Def file \"%s\" not found",basename);*/ GRIB_MUTEX_UNLOCK(&mutex_c); full[0]=0; return NULL; }
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; }
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; }