static int compare(grib_accessor* a,grib_accessor* b)
{
    int retval=0;
    char *aval=0;
    char *bval=0;

    size_t alen = 0;
    size_t blen = 0;
    int err=0;
    long count=0;

    err=grib_value_count(a,&count);
    if (err) return err;
    alen=count;

    err=grib_value_count(b,&count);
    if (err) return err;
    blen=count;

    if (alen != blen) return GRIB_COUNT_MISMATCH;

    aval=(char*)grib_context_malloc(a->parent->h->context,alen*sizeof(char));
    bval=(char*)grib_context_malloc(b->parent->h->context,blen*sizeof(char));

    grib_unpack_string(a,aval,&alen);
    grib_unpack_string(b,bval,&blen);

    retval = GRIB_SUCCESS;
    if (!aval || !bval || grib_inline_strcmp(aval,bval)) retval = GRIB_STRING_VALUE_MISMATCH;

    grib_context_free(a->parent->h->context,aval);
    grib_context_free(b->parent->h->context,bval);

    return retval;
}
static int evaluate_long(grib_expression *g,grib_handle* h,long* lres)
{
  int ret=0;
  char b1[1024]; size_t l1 = sizeof(b1);
  char b2[1024]; size_t l2 = sizeof(b2);
  const char *v1;
  const char *v2;

  grib_expression_string_compare* e = (grib_expression_string_compare*)g;

  v1 = grib_expression_evaluate_string(h,e->left,b1,&l1,&ret);
  if(!v1) {*lres=0;return ret;}

  v2 = grib_expression_evaluate_string(h,e->right,b2,&l2,&ret);
  if(!v2) {*lres=0;return ret;}

  *lres = (grib_inline_strcmp(v1,v2) == 0);
  return GRIB_SUCCESS;
}