Exemplo n.º 1
0
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 int unpack_string (grib_accessor* a, char* buffer, size_t *len)
{
    grib_accessor_dictionary* self = (grib_accessor_dictionary*)a;
    int err = GRIB_SUCCESS;
    char key[1024]={0,};
    size_t size=1024;
    char* list=NULL;
    char* start=NULL;
    char* end=NULL;
    size_t rsize=0;
    int i=0;

    grib_trie* dictionary=load_dictionary(a->context,a,&err);
    if (err) return err;

    if((err=grib_get_string_internal(grib_handle_of_accessor(a),self->key,key,&size)) != GRIB_SUCCESS) {
        /* grib_trie_delete(dictionary); */
        return err;
    }

    list=(char*)grib_trie_get(dictionary,key);
    if (!list) {
        /* grib_trie_delete(dictionary); */
        return GRIB_NOT_FOUND;
    }

    end=list;
    for (i=0;i<=self->column;i++) {
        start=end;
        while (*end != '|' && *end!=0) end++;
        if (! *end ) {
            break;
        }
        end++;
    }
    end--;
    rsize=end-start;
    if (*len < rsize) {
        /* grib_trie_delete(dictionary); */
        return GRIB_ARRAY_TOO_SMALL;
    }

    *len=rsize;
    memcpy(buffer,start,rsize);
    buffer[rsize]=0;

    /* grib_trie_delete(dictionary); */

    return err;
}
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 int evaluate_double(grib_expression *g,grib_handle *h,double* result)
{
  grib_expression_is_in_list* e = (grib_expression_is_in_list*)g;
  int err=0;
  char mybuf[1024]={0,};
  size_t size=1024;

  grib_trie* list=load_list(h->context,g,&err);

  if((err=grib_get_string_internal(h,e->name,mybuf,&size)) != GRIB_SUCCESS)
      return err;

  if (grib_trie_get(list,mybuf)) *result=1;
  else *result=0;

  return err;
}
static string evaluate_string(grib_expression* g,grib_handle* h,char* buf,size_t* size,int* err)
{
  grib_expression_is_in_list* e = (grib_expression_is_in_list*)g;
  char mybuf[1024]={0,};
  size_t sizebuf=1024;
  long result;

  grib_trie* list=load_list(h->context,g,err);

  if((*err=grib_get_string_internal(h,e->name,mybuf,&sizebuf)) != GRIB_SUCCESS)
      return NULL;

  if (grib_trie_get(list,mybuf)) result=1;
  else result=0;

  sprintf(buf,"%ld",result);
  *size=strlen(buf);
  return buf;
}
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;
}