Listing 1
/* Listing-1: recls-Ruby extension entry point */ static VALUE mRecls; /* Recls module: ::Recls */ static VALUE cFileSearch; /* FileSearch class: ::Recls::FileSearch */ static VALUE cEntry; /* Entry class: ::Recls::FileSearch::Entry*/ . . . void Init_recls() { char version[101]; TRACETODEBUGGER("Initialising recls extension for Ruby\n"); sprintf(version, "%d.%d.%d", RECLS_VER_MAJOR, RECLS_VER_MINOR , RECLS_VER_REVISION); /* Recls module */ mRecls = rb_define_module("Recls"); rb_define_const(mRecls, "RECLS_VERSION",rb_str_new2(version)); rb_define_const(mRecls, "VERSION",rb_str_new2(version)); rb_define_const(mRecls, "RECLS_F_FILES", rb_uint2inum(RECLS_F_FILES)); . . . and for "RECLS_F_DIRECTORIES", "RECLS_F_LINKS", "RECLS_F_DEVICES", "RECLS_F_TYPEMASK", "RECLS_F_RECURSIVE", "RECLS_F_NO_FOLLOW_LINKS", "RECLS_F_DIRECTORY_PARTS" and "RECLS_F_DETAILS_LATER" rb_define_module_function(mRecls, "roots", recls_roots_get, 0); rb_define_module_function(mRecls, "pathNameSeparator" , recls_pathNameSeparator_get, 0); rb_define_module_function(mRecls, "pathSeparator" , recls_pathSeparator_get, 0); rb_define_module_function(mRecls, "wildcardsAll" , recls_wildcardsAll_get, 0); /* FileSearch class */ cFileSearch = rb_define_class_under(mRecls, "FileSearch", rb_cObject); rb_include_module(cFileSearch, rb_mEnumerable); rb_define_method(cFileSearch, "initialize", FileSearch_initialize , 3); rb_define_method(cFileSearch, "each", FileSearch_each, 0); rb_define_attr(cFileSearch, "searchRoot", 1, 0); rb_define_attr(cFileSearch, "pattern", 1, 0); rb_define_attr(cFileSearch, "flags", 1, 0); /* Entry class */ cEntry = rb_define_class_under(cFileSearch, "Entry", rb_cObject); rb_include_module(cEntry, rb_mComparable); rb_define_attr(cEntry, "path", 1, 0); rb_define_attr(cEntry, "drive", 1, 0); rb_define_method(cEntry, "directory", Entry_directory_get, 0); rb_define_method(cEntry, "directoryPath", Entry_directoryPath_get, 0); rb_define_method(cEntry, "directoryParts", Entry_directoryParts_get, 0); rb_define_attr(cEntry, "file", 1, 0); rb_define_method(cEntry, "shortFile", Entry_shortFile_get, 0); rb_define_method(cEntry, "fileName", Entry_fileName_get, 0); rb_define_method(cEntry, "fileExt", Entry_fileExt_get, 0); rb_define_method(cEntry, "creationTime", Entry_creationTime_get, 0); . . . and for "modificationTime", "lastAccessTime" and "lastStatusChangeTime" rb_define_method(cEntry, "size", Entry_size_get, 0); rb_define_method(cEntry, "isReadOnly", Entry_isReadOnly_get, 0); . . . and for "isDirectory" and "isLink" rb_define_method(cEntry, "<=>", Entry_cmp, 1); rb_define_alias(cEntry, "to_s", "path"); }