static int evaluate_long(grib_expression *g,grib_handle* h,long* lres)
{
    long v1=0;
    long v2=0;
    int ret;
    grib_expression_binop* e = (grib_expression_binop*)g;

#if 0 /* DEBUGGING */
    {
        int typeLeft, typeRight;
        const char* nameLeft;
        const char* nameRight;
        typeLeft = grib_expression_native_type(h, e->left);
        typeRight = grib_expression_native_type(h, e->right);
        nameLeft = grib_expression_get_name(e->left);
        nameRight= grib_expression_get_name(e->right);
        printf("eval_long nameLeft=%s (type=%d), nameRight=%s (type=%d)\n",nameLeft,typeLeft, nameRight,typeRight);
        grib_expression_print(h->context, g, h);
        printf("\n");
    }
#endif

    ret = grib_expression_evaluate_long(h,e->left,&v1);
    if (ret != GRIB_SUCCESS) return ret;

    ret = grib_expression_evaluate_long(h,e->right,&v2);
    if (ret != GRIB_SUCCESS) return ret;

    *lres=e->long_func(v1,v2);
    return GRIB_SUCCESS;
}
static int pack_expression(grib_accessor* a, grib_expression *e){
  const char* cval;
  int ret=0;
  long lval=0;
  size_t len = 1;
  char tmp[1024];

  if (strcmp(e->cclass->name,"long")==0) {
    ret=grib_expression_evaluate_long(a->parent->h,e,&lval);
    ret = grib_pack_long(a,&lval,&len);
  } else {
    len = sizeof(tmp);
    cval = grib_expression_evaluate_string(a->parent->h,e,tmp,&len,&ret);
    if (ret!=GRIB_SUCCESS) {
      grib_context_log(a->parent->h->context,GRIB_LOG_ERROR,"grib_accessor_codetable.pack_expression: unable to evaluate string %s to be set in %s\n",grib_expression_get_name(e),a->name);
	  return ret;
    }
    len = strlen(cval) + 1;
    ret = grib_pack_string(a,cval,&len);
  }
  return ret;
}