static int execute(grib_action* act, grib_handle *h) { grib_action_if* a = (grib_action_if*)act; grib_action* next = NULL; int ret = 0; long lres=0; /* See GRIB-394 */ int type = grib_expression_native_type(h, a->expression); if (type != GRIB_TYPE_DOUBLE) { if ((ret=grib_expression_evaluate_long(h,a->expression,&lres)) != GRIB_SUCCESS) { if (ret == GRIB_NOT_FOUND) lres=0; else return ret; } } else { double dres = 0.0; ret = grib_expression_evaluate_double(h, a->expression, &dres); lres = (long)dres; if ( ret != GRIB_SUCCESS ) { if (ret == GRIB_NOT_FOUND) lres=0; else return ret; } } if(lres) next = a->block_true; else next = a->block_false; while(next){ ret = grib_action_execute(next, h); if(ret != GRIB_SUCCESS) return ret; next= next->next; } return GRIB_SUCCESS; }
static int execute(grib_action* act, grib_handle *h) { grib_action_switch* a = (grib_action_switch*)act; grib_case* c=a->Case; grib_action* next = a->Default; grib_arguments* args=a->args; grib_arguments* values; grib_expression* e; grib_expression* value; int ret = 0; long lres=0; double dres=0; long lval=0; double dval=0; int type=0; int ok=0; const char *cval; const char *cres; char buf[80]; char tmp[80]; size_t len = sizeof(buf); size_t size=sizeof(tmp); int err=0; Assert(args); while (c) { e=args->expression; values=c->values; value=values->expression; ok=0; while (e && value) { if (!strcmp(value->cclass->name,"true")) ok=1; else { type=grib_expression_native_type(h,value); switch(type) { case GRIB_TYPE_LONG: ok= ( grib_expression_evaluate_long(h,value,&lres) == GRIB_SUCCESS) && ( grib_expression_evaluate_long(h,e,&lval) == GRIB_SUCCESS) && (lval == lres); break; case GRIB_TYPE_DOUBLE: ok = ( grib_expression_evaluate_double(h,value,&dres) == GRIB_SUCCESS) && ( grib_expression_evaluate_double(h,e,&dval) == GRIB_SUCCESS) && (dval == dres); break; case GRIB_TYPE_STRING: len = sizeof(buf); size=sizeof(tmp); ok = ((cres=grib_expression_evaluate_string(h,e,buf,&len,&err)) != NULL ) && (err==0) && ((cval = grib_expression_evaluate_string(h,value,tmp,&size,&err)) != NULL) && (err==0) && ((strcmp(buf,cval) == 0) || (strcmp(cval,"*")==0)); break; default: /* TODO: */ break; } } if (!ok) break; args=args->next; if (args) e=args->expression; else e=NULL; values=values->next; if (values) value=values->expression; else value=NULL; } if(ok) { next=c->action; break; } c=c->next; } if (!next) return GRIB_SWITCH_NO_MATCH; while(next){ ret = grib_action_execute(next, h); if(ret != GRIB_SUCCESS) return ret; next= next->next; } return GRIB_SUCCESS; }