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