Listing 3

/* Listing-3: recls-Ruby extension FileSearch functions */

static VALUE FileSearch_initialize( VALUE self, VALUE searchRoot
                      , VALUE pattern, VALUE flags)
{
  Check_Type(searchRoot, T_STRING);
  Check_Type(pattern, T_STRING);
  Check_Type(flags, T_FIXNUM);

  rb_iv_set(self, "searchRoot", searchRoot);
  rb_iv_set(self, "pattern", pattern);
  rb_iv_set(self, "flags", flags);

  return self;
}
static VALUE FileSearch_each(VALUE self)
{
  VALUE           searchRoot  = rb_iv_get(self, "searchRoot");
  VALUE           pattern     = rb_iv_get(self, "pattern");
  recls_uint32_t  flags       = FIX2INT(rb_iv_get(self, "flags"));

  hrecls_t        hSrch;
  recls_rc_t      rc;
  rc = Recls_Search( StringValuePtr(searchRoot),
                    StringValuePtr(pattern), flags, &hSrch);
  if(RECLS_FAILED(rc))
  {
    /* Failure with no-more-data is ok. All others require a throw error. */
    if(RECLS_RC_NO_MORE_DATA != rc)
    {
      char  szError[501];
      char  szMessage[601];

      Recls_GetErrorString(rc, szError, NUM_ELEMENTS(szError));
      sprintf(szMessage, "Search failed: %s", szError);
      rb_throw(szMessage, Qnil);
      return Qnil;
    }
  }
  else
  {
    recls_info_t  entry;
    rc = Recls_GetDetails(hSrch, &entry);
    for(; RECLS_SUCCEEDED(rc); 
          rc = Recls_GetNextDetails(hSrch, &entry))
    {
      /* Yield, with the requisite entry */
      rb_yield(Entry_create(entry));
    }
    Recls_SearchClose(hSrch);
  }
  return self;
}