예제 #1
0
grib_action* grib_action_create_gen(grib_context* context, const char* name, const char* op, const long len,
        grib_arguments* params,  grib_arguments* default_value,int flags,const char* name_space,const char* set)
{
    grib_action_gen* a     =  NULL;
    grib_action_class* c   =  grib_action_class_gen;
    grib_action* act       =  (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
    act->next              =  NULL;
    act->name              =  grib_context_strdup_persistent(context, name);
    act->op                =  grib_context_strdup_persistent(context, op);
    if(name_space)
        act->name_space        =  grib_context_strdup_persistent(context, name_space);
    act->cclass            =  c;
    act->context           =  context;
    act->flags             =  flags;
    a                      =  (grib_action_gen*)act;

    a->len                 =  len;

    a->params              =  params;
    if (set)
        act->set				=	grib_context_strdup_persistent(context, set);
    act->default_value       =  default_value;

    return act;
}
예제 #2
0
grib_action* grib_action_create_set_darray( grib_context* context,
  const char* name,
    grib_darray* darray)
{
  char buf[1024];

  grib_action_set_darray* a ;
  grib_action_class* c   = grib_action_class_set_darray;
  grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
  act->op              = grib_context_strdup_persistent(context,"section");

  act->cclass       = c;
  a                 = (grib_action_set_darray*)act;
  act->context      = context;

  a->darray  = darray;
  a->name        = grib_context_strdup_persistent(context,name);


  sprintf(buf,"set_darray%p",(void*)darray);

  act->name      = grib_context_strdup_persistent(context,buf);

  return act;
}
예제 #3
0
grib_action* grib_action_create_if( grib_context* context,
        grib_expression* expression,
        grib_action* block_true,grib_action* block_false,int transient)
{
    char name[1024];
    grib_action_if* a ;
    grib_action_class* c   = grib_action_class_if;
    grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
    act->op              = grib_context_strdup_persistent(context,"section");

    act->cclass       = c;
    a                 = (grib_action_if*)act;
    act->context      = context;

    a->expression  = expression;
    a->block_true  = block_true;
    a->block_false = block_false;
    a->transient   = transient;

    if (transient)
        sprintf(name,"__if%p",(void*)a);
    else
        sprintf(name,"_if%p",(void*)a);

    act->name      = grib_context_strdup_persistent(context,name);

    return act;
}
예제 #4
0
grib_action* grib_action_create_print( grib_context* context, const char* name,char* outname)
{
  char buf[1024];

  grib_action_print* a ;
  grib_action_class* c   = grib_action_class_print;
  grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
  act->op              =  grib_context_strdup_persistent(context,"section");

  act->cclass            = c;
  a                      = (grib_action_print*)act;
  act->context           = context;

  a->name            = grib_context_strdup_persistent(context,name);

  if (outname) {
    FILE* out=NULL;
    int ioerr=0;
    a->outname      = grib_context_strdup_persistent(context,outname);
    out=fopen(outname,"w");
    ioerr=errno;
    if (!out)   {
      grib_context_log(act->context,(GRIB_LOG_ERROR)|(GRIB_LOG_PERROR),
        "IO ERROR: %s: %s",strerror(ioerr),outname);
    }
    if (out) fclose(out);
  }

  sprintf(buf,"print%p",(void*)a->name);

  act->name      = grib_context_strdup_persistent(context,buf);

  return act;
}
예제 #5
0
grib_action* grib_action_create_set( grib_context* context,
  const char* name,    grib_expression* expression,int nofail)
{
  char buf[1024];

  grib_action_set* a ;
  grib_action_class* c   = grib_action_class_set;
  grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
  act->op              = grib_context_strdup_persistent(context,"section");

  act->cclass       = c;
  a                 = (grib_action_set*)act;
  act->context      = context;

  a->expression  = expression;
  a->name        = grib_context_strdup_persistent(context,name);
  a->nofail      = nofail;


  sprintf(buf,"set%p",(void*)expression);

  act->name      = grib_context_strdup_persistent(context,buf);

  return act;
}
grib_expression* new_is_in_list_expression(grib_context* c,const char* name,const char* list)
{
  grib_expression_is_in_list* e = (grib_expression_is_in_list*)grib_context_malloc_clear_persistent(c,sizeof(grib_expression_is_in_list));
  e->base.cclass            = grib_expression_class_is_in_list;
  e->name                   = grib_context_strdup_persistent(c,name);
  e->list                   = grib_context_strdup_persistent(c,list);
  return (grib_expression*)e;
}
예제 #7
0
grib_action* grib_action_create_put( grib_context* context, const char* name ,grib_arguments *args )
{
	grib_action_put*  a    =  NULL;
	grib_action_class* c   =  grib_action_class_put;
	grib_action* act       =  (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
	act->next              =  NULL;
	act->name              =  grib_context_strdup_persistent(context,name);
	act->op                =  grib_context_strdup_persistent(context,"forward");
	act->cclass            =  c;
	act->context           =  context;
	a                      =  (grib_action_put*)act; 
	a->args                =  args;    
	return act;
}
grib_expression* new_string_expression(grib_context* c,const char* value)
{
	grib_expression_string* e = grib_context_malloc_clear_persistent(c,sizeof(grib_expression_string));
	e->base.cclass                 = grib_expression_class_string;
	e->value               = grib_context_strdup_persistent(c,value);
	return (grib_expression*)e;
}
예제 #9
0
grib_rule_entry *grib_new_rule_entry(grib_context* c,const char* name,grib_expression* expression)
{
	grib_rule_entry* e = (grib_rule_entry*)grib_context_malloc_clear_persistent(c,sizeof(grib_rule_entry));
	e->name            = grib_context_strdup_persistent(c,name);
	e->value           = expression;
	return e;
}
grib_expression* new_accessor_expression(grib_context* c,const char *name)
{
  grib_expression_accessor* e = grib_context_malloc_clear_persistent(c,sizeof(grib_expression_accessor));
  e->base.cclass                 = grib_expression_class_accessor;
  e->name                   = grib_context_strdup_persistent(c,name);
  return (grib_expression*)e;
}
예제 #11
0
grib_action* grib_action_create_template( grib_context* context,int nofail,const char* name , const char* arg1)
{
  grib_action_template* a   ;
  grib_action_class* c   =  grib_action_class_template;
  grib_action* act       =  (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
  act-> name             =  grib_context_strdup_persistent(context,name);
  act-> op               =  grib_context_strdup_persistent(context,"section");
  act-> cclass           =  c;
  act-> next             =  NULL;
  act->context           =  context;
  a                      =  (grib_action_template*)act;
  a->nofail=nofail;
  if (arg1) a->arg       =  grib_context_strdup_persistent(context,arg1);
  else  a->arg = NULL;

  return act;
}
예제 #12
0
grib_action* grib_action_create_noop( grib_context* context,const char* fname)
{
    char buf[1024];

    grib_action_noop* a ;
    grib_action_class* c   = grib_action_class_noop;
    grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
    act->op                = grib_context_strdup_persistent(context,"section");

    act->cclass       = c;
    a                 = (grib_action_noop*)act;
    act->context      = context;

    sprintf(buf,"_noop%p",(void*)a);

    act->name      = grib_context_strdup_persistent(context,buf);

    return act;
}
예제 #13
0
grib_action* grib_action_create_alias(grib_context* context, const char* name, const char* arg1,const char* name_space,int flags)
{
    grib_action_alias* a                            ;
    grib_action_class* c   =  grib_action_class_alias;
    grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);

    act->context = context;

    act->op           = NULL;
    act->name         = grib_context_strdup_persistent(context, name);
    if(name_space)
        act->name_space =  grib_context_strdup_persistent(context, name_space);

    act->cclass       = c;
    act->flags        = flags;
    a                 = (grib_action_alias*)act;
    a->target         = arg1 ? grib_context_strdup_persistent(context, arg1) : NULL;

    return act;
}
예제 #14
0
grib_action *grib_action_create_trigger(grib_context *context, grib_arguments *args, grib_action *block)
{
	char name[1024];

	grib_action_trigger* a = 0;
	grib_action_class* c   =  grib_action_class_trigger;
	grib_action* act       =  (grib_action*)grib_context_malloc_clear_persistent(context,c->size);

	sprintf(name,"_trigger%p",(void*)act);

	act-> name             =  grib_context_strdup_persistent(context,name);
	act-> op               =  grib_context_strdup_persistent(context,"section");
	act-> cclass           =  c;
	act-> next             =  NULL;
	act->context           =  context;

	a = ( grib_action_trigger*)act;
	a->trigger_on        = args;
	a->block             = block;

	return act;
}
예제 #15
0
grib_action* grib_action_create_modify( grib_context* context, 
	const char* name,
		long flags)
{  
	
	grib_action_modify* a ;
	grib_action_class* c   = grib_action_class_modify;
	grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
	act->op              = grib_context_strdup_persistent(context,"section");

	act->cclass       = c;
	a                 = (grib_action_modify*)act;
	act->context      = context;

	a->flags       = flags;
	a->name        = grib_context_strdup_persistent(context,name);


	act->name      = grib_context_strdup_persistent(context,"flags");

	return act;
}
예제 #16
0
grib_action* grib_action_create_variable( grib_context* context, const char* name, const char* op, const long len,  grib_arguments* params,  grib_arguments* default_value,int flags,const char* name_space)
{
	grib_action_variable* a     =  NULL;
	grib_action_class* c   =  grib_action_class_variable;
	grib_action* act       =  (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
	act->next              =  NULL;
	act->name              =  grib_context_strdup_persistent(context, name);
	if(name_space)
	act->name_space              =  grib_context_strdup_persistent(context, name_space);
	act->op                =  grib_context_strdup_persistent(context, op);
	act->cclass            =  c;
	act->context           =  context;
	act->flags             =  flags;
	a                      =  (grib_action_variable*)act;
	a->len                 =  len;
	a->params              =  params;
	act->default_value       =  default_value;

	/* printf("CREATE %s\n",name); */

	return act;
}
예제 #17
0
grib_action* grib_action_create_meta( grib_context* context, const char* name, const char* op, 
		grib_arguments*   params,  grib_arguments*   default_value,unsigned long flags,const char* name_space)
{
	grib_action_meta*  a   =  (grib_action_meta*)grib_context_malloc_clear_persistent(context,sizeof(grib_action_meta));
	grib_action* act       =  (grib_action*)a;
	act->next              =  NULL;
	act->name              =  grib_context_strdup_persistent(context, name);
	act->op                =  grib_context_strdup_persistent(context, op);
	if(name_space)
	act->name_space                =  grib_context_strdup_persistent(context, name_space);
	act->cclass            =  grib_action_class_meta;
	act->context           = context;
	act->flags             = flags;
	a->params              =  params;
	act->default_value                = default_value;
	a->len                 = 0;
	

	/* grib_arguments_print(context,a->params,0); printf("\n"); */


	return act;
}
예제 #18
0
grib_action* grib_action_create_write( grib_context* context, const char* name,int append,int padtomultiple)
{
    char buf[1024];

    grib_action_write* a =NULL;
    grib_action_class* c   = grib_action_class_write;
    grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
    act->op              =  grib_context_strdup_persistent(context,"section");

    act->cclass            = c;
    a                      = (grib_action_write*)act;
    act->context           = context;

    a->name            = grib_context_strdup_persistent(context,name);

    sprintf(buf,"write%p",(void*)a->name);

    act->name      = grib_context_strdup_persistent(context,buf);
    a->append=append;
    a->padtomultiple=padtomultiple;

    return act;
}
예제 #19
0
grib_action* grib_action_create_switch( grib_context* context,
        grib_arguments* args,
        grib_case* Case,
        grib_action* Default)
{   char name[1024];
grib_action_switch* a ;
grib_action_class* c   = grib_action_class_switch;
grib_action* act       = (grib_action*)grib_context_malloc_clear_persistent(context,c->size);
act->op              = grib_context_strdup_persistent(context,"section");

act->cclass       = c;
a                 = (grib_action_switch*)act;
act->context      = context;

a->args = args;
a->Case = Case;
a->Default = Default;

sprintf(name,"_switch%p",(void*)a);

act->name      = grib_context_strdup_persistent(context,name);

return act;
}
static int grib_load_codetable(grib_context* c,const char* filename,
           const char* recomposed_name,size_t size,grib_codetable* t) {
  char line[1024];
  FILE *f = NULL;

  grib_context_log(c,GRIB_LOG_DEBUG,"Loading code table form %s",filename);

  f=fopen(filename, "r");
  if (!f) return GRIB_IO_PROBLEM;

  Assert(t!=NULL);

  if (t->filename[0] == NULL ){
    t->filename[0]  = grib_context_strdup_persistent(c,filename);
    t->recomposed_name[0]  = grib_context_strdup_persistent(c,recomposed_name);
    t->next      = c->codetable;
    t->size      = size;
    c->codetable = t;
  } else {
    t->filename[1]  = grib_context_strdup_persistent(c,filename);
    t->recomposed_name[1]  = grib_context_strdup_persistent(c,recomposed_name);
  }

  while(fgets(line,sizeof(line)-1,f))
  {
    char* p = line;
    int code    = 0;
    char abbreviation[1024] = {0,};
    char title[1024]={0,};
    char* q = abbreviation;
    char* r = title;
    char* units=0;
    char unknown[]="unknown";

    line[strlen(line)-1] = 0;

    while(*p != '\0' && isspace(*p)) p++;

    if(*p == '#')
      continue;

    while(*p != '\0' && isspace(*p)) p++;

    if( *p =='\0' ) continue;

    Assert(isdigit(*p));

    while(*p != '\0')
    {
      if(isspace(*p)) break;
      code *= 10;
      code += *p - '0';
      p++;
    }

    if(code <0 || code >= size)
    {
      grib_context_log(c,GRIB_LOG_WARNING,"code_table_entry: invalide code in %s: %d (table size=%d)",filename,code,size);
      continue;
    }

    while(*p != '\0' && isspace(*p)) p++;

    while(*p != '\0')
    {
      if(isspace(*p)) break;
      *q++ = *p++;
    }
    *q = 0;
    while(*p != '\0' && isspace(*p)) p++;

    while(*p != '\0')
    {
      if(*p == '(' ) break;
      *r++ = *p++;
    }
    *r = 0;

    while(*p != '\0' && isspace(*p)) p++;
    if (*p != '\0') {
      units=++p;
      while(*p != '\0' && *p != ')' ) p++;
      *p='\0';
    } else {
      units=unknown;
    }

    Assert(*abbreviation);
    Assert(*title);

    if(t->entries[code].abbreviation != NULL)
    {
      grib_context_log(c,GRIB_LOG_WARNING,"code_table_entry: duplicate code in %s: %d (table size=%d)",filename,code,size);
      continue;
    }

    Assert(t->entries[code].abbreviation == NULL);
    Assert(t->entries[code].title        == NULL);

    t->entries[code].abbreviation = grib_context_strdup_persistent(c,abbreviation);
    t->entries[code].title        = grib_context_strdup_persistent(c,title);
    t->entries[code].units        = grib_context_strdup_persistent(c,units);


  }

  fclose(f);

  return 0;

}