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;
}