/* * PhysicsFS - ruby interface * * Author:: Ed Sinjiashvili (slimb@vlinkmail.com) * License:: LGPL */ #include "physfs.h" #include "ruby.h" #include "rb_physfs.h" #include "rb_physfs_file.h" VALUE modulePhysfs; /* * PhysicsFS::init str * * initialize PhysicsFS */ VALUE physfs_init (VALUE self, VALUE str) { int result = PHYSFS_init (STR2CSTR(str)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::deinit */ VALUE physfs_deinit (VALUE self) { if (PHYSFS_deinit ()) return Qtrue; return Qfalse; } /* * PhysicsFS::version * * return PhysicsFS::Version object */ VALUE physfs_version (VALUE self) { char evalStr[200]; PHYSFS_Version ver; PHYSFS_getLinkedVersion (&ver); sprintf (evalStr, "PhysicsFS::Version.new %d, %d, %d", ver.major, ver.minor, ver.patch); return rb_eval_string (evalStr); } /* * PhysicsFS::supported_archives * * return Array of PhysicsFS::ArchiveInfo objects */ VALUE physfs_supported_archives (VALUE self) { const PHYSFS_ArchiveInfo **info = PHYSFS_supportedArchiveTypes(); VALUE klass = rb_const_get (modulePhysfs, rb_intern ("ArchiveInfo")); VALUE ary = rb_ary_new (); VALUE params[4]; while ( *info != 0 ) { params[0] = rb_str_new2 ((*info)->extension); params[1] = rb_str_new2 ((*info)->description); params[2] = rb_str_new2 ((*info)->author); params[3] = rb_str_new2 ((*info)->url); rb_ary_push (ary, rb_class_new_instance (4, params, klass)); info++; } return ary; } /* * PhysicsFS::last_error * * return string representation of last PhysicsFS error */ VALUE physfs_last_error (VALUE self) { const char *last_error = PHYSFS_getLastError (); if (last_error == 0) last_error = ""; return rb_str_new2 (last_error); } /* * PhysicsFS::dir_separator * * return platform directory separator */ VALUE physfs_dir_separator (VALUE self) { return rb_str_new2 (PHYSFS_getDirSeparator ()); } /* * PhysicsFS::permit_symlinks boolValue * * turn symlinks support on/off */ VALUE physfs_permit_symlinks (VALUE self, VALUE allow) { int p = 1; if (allow == Qfalse || allow == Qnil) p = 0; PHYSFS_permitSymbolicLinks (p); return Qtrue; } /* * PhysicsFS::cdrom_dirs * * return Array of strings containing available CDs */ VALUE physfs_cdrom_dirs (VALUE self) { char **cds = PHYSFS_getCdRomDirs(); char **i; VALUE ary = rb_ary_new (); for (i = cds; *i != 0; i++) rb_ary_push (ary, rb_str_new2 (*i)); PHYSFS_freeList (cds); return ary; } /* * PhysicsFS::base_dir * * return base directory */ VALUE physfs_base_dir (VALUE self) { const char *base_dir = PHYSFS_getBaseDir (); if (base_dir == 0) base_dir = ""; return rb_str_new2 (base_dir); } /* * PhysicsFS::user_dir * * return user directory */ VALUE physfs_user_dir (VALUE self) { const char *user_dir = PHYSFS_getBaseDir (); if (user_dir == 0) user_dir = ""; return rb_str_new2 (user_dir); } /* * PhysicsFS::write_dir * * return write directory */ VALUE physfs_write_dir (VALUE self) { const char *write_dir = PHYSFS_getWriteDir (); if (write_dir == 0) return Qnil; return rb_str_new2 (write_dir); } /* * PhysicsFS::write_dir= str * * set write directory to *str* */ VALUE physfs_set_write_dir (VALUE self, VALUE str) { int result = PHYSFS_setWriteDir (STR2CSTR(str)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::add_to_search_path str, append * * if append > 0 - append str to search path, otherwise prepend it */ VALUE physfs_add_search_path (VALUE self, VALUE str, VALUE append) { int result = PHYSFS_addToSearchPath (STR2CSTR(str), FIX2INT(append)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::remove_from_search_path str * * removes str from search path */ VALUE physfs_remove_search_path (VALUE self, VALUE str) { int result = PHYSFS_removeFromSearchPath (STR2CSTR(str)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::search_path * * return current search_path - as array of strings */ VALUE physfs_search_path (VALUE self) { char **path = PHYSFS_getSearchPath (); char **i; VALUE ary = rb_ary_new (); for (i = path ; *i != 0; i++) rb_ary_push (ary, rb_str_new2 (*i)); PHYSFS_freeList (path); return ary; } // VALUE physfs_setSaneConfig(VALUE self, VALUE org, VALUE app, VALUE ext, VALUE includeCdroms, VALUE archivesFirst) { int res = PHYSFS_setSaneConfig (STR2CSTR(org), STR2CSTR(app), STR2CSTR(ext), RTEST(includeCdroms), RTEST(archivesFirst)); if (res) return Qtrue; return Qfalse; } /* * PhysicsFS::mkdir newdir * * create new directory */ VALUE physfs_mkdir (VALUE self, VALUE newdir) { int result = PHYSFS_mkdir (STR2CSTR(newdir)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::delete name * * delete file with name */ VALUE physfs_delete (VALUE self, VALUE name) { int result = PHYSFS_delete (STR2CSTR(name)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::real_dir name * * return real directory (in search path) of a name */ VALUE physfs_real_dir (VALUE self, VALUE name) { const char *path = PHYSFS_getRealDir (STR2CSTR(name)); if (path == 0) return Qnil; return rb_str_new2 (path); } /* * PhysicsFS::enumerate dir * * list a dir from a search path */ VALUE physfs_enumerate (VALUE self, VALUE dir) { char **files = PHYSFS_enumerateFiles (STR2CSTR(dir)); char **i; VALUE ary = rb_ary_new (); for (i = files; *i != 0; i++) rb_ary_push (ary, rb_str_new2 (*i)); PHYSFS_freeList (files); return ary; } /* * PhysicsFS::exists? name * * does a file with name exist? */ VALUE physfs_exists (VALUE self, VALUE name) { int result = PHYSFS_exists (STR2CSTR(name)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::is_directory? name * * return true if name is directory */ VALUE physfs_is_directory (VALUE self, VALUE name) { int result = PHYSFS_isDirectory (STR2CSTR(name)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::is_symlink? name * * return true if name is symlink */ VALUE physfs_is_symlink (VALUE self, VALUE name) { int result = PHYSFS_isSymbolicLink (STR2CSTR(name)); if (result) return Qtrue; return Qfalse; } /* * PhysicsFS::last_mod_time name * * return last modification time of a file */ VALUE physfs_last_mod_time (VALUE self, VALUE name) { int result = PHYSFS_getLastModTime (STR2CSTR(name)); return INT2FIX(result); } /* * PhysicsFS::open_read name * * return +PhysicsFS::File+ ready for reading */ VALUE physfs_open_read (VALUE self, VALUE name) { PHYSFS_file *file = PHYSFS_openRead (STR2CSTR(name)); return physfs_file_new (file); } /* * PhysicsFS::open_write name * * return PhysicsFS::File ready for writing */ VALUE physfs_open_write (VALUE self, VALUE name) { PHYSFS_file *file = PHYSFS_openWrite (STR2CSTR(name)); return physfs_file_new (file); } /* * PhysicsFS::open_append name * * return PhysicsFS::File ready for appending */ VALUE physfs_open_append (VALUE self, VALUE name) { PHYSFS_file *file = PHYSFS_openAppend (STR2CSTR(name)); return physfs_file_new (file); } void Init_physfs_so (void) { modulePhysfs = rb_define_module ("PhysicsFS"); rb_define_singleton_method (modulePhysfs, "init_internal", physfs_init, 1); rb_define_singleton_method (modulePhysfs, "deinit", physfs_deinit, 0); rb_define_singleton_method (modulePhysfs, "version", physfs_version, 0); rb_define_singleton_method (modulePhysfs, "supported_archives", physfs_supported_archives, 0); rb_define_singleton_method (modulePhysfs, "last_error", physfs_last_error, 0); rb_define_singleton_method (modulePhysfs, "dir_separator", physfs_dir_separator, 0); rb_define_singleton_method (modulePhysfs, "permit_symlinks", physfs_permit_symlinks, 1); rb_define_singleton_method (modulePhysfs, "cdrom_dirs", physfs_cdrom_dirs, 0); rb_define_singleton_method (modulePhysfs, "base_dir", physfs_base_dir, 0); rb_define_singleton_method (modulePhysfs, "user_dir", physfs_user_dir, 0); rb_define_singleton_method (modulePhysfs, "write_dir", physfs_write_dir, 0); rb_define_singleton_method (modulePhysfs, "write_dir=", physfs_set_write_dir, 1); rb_define_singleton_method (modulePhysfs, "add_to_search_path", physfs_add_search_path, 2); rb_define_singleton_method (modulePhysfs, "remove_from_search_path", physfs_remove_search_path, 1); rb_define_singleton_method (modulePhysfs, "search_path", physfs_search_path, 0); rb_define_singleton_method (modulePhysfs, "set_sane_config", physfs_setSaneConfig, 5); rb_define_singleton_method (modulePhysfs, "mkdir", physfs_mkdir, 1); rb_define_singleton_method (modulePhysfs, "delete", physfs_delete, 1); rb_define_singleton_method (modulePhysfs, "real_dir", physfs_real_dir, 1); rb_define_singleton_method (modulePhysfs, "enumerate", physfs_enumerate, 1); rb_define_singleton_method (modulePhysfs, "exists?", physfs_exists, 1); rb_define_singleton_method (modulePhysfs, "is_directory?", physfs_is_directory, 1); rb_define_singleton_method (modulePhysfs, "is_symlink?", physfs_is_symlink, 1); rb_define_singleton_method (modulePhysfs, "last_mod_time", physfs_last_mod_time, 1); rb_define_singleton_method (modulePhysfs, "open_read", physfs_open_read, 1); rb_define_singleton_method (modulePhysfs, "open_write", physfs_open_write, 1); rb_define_singleton_method (modulePhysfs, "open_append", physfs_open_append, 1); init_physfs_file (); init_sdl_rwops (); } /* // Local Variables: // mode: C // c-indentation-style: "stroustrup" // indent-tabs-mode: nil // End: */