# # PhysicsFS test program - mimics real physfs_test # require 'readline' require 'physfs' def die msg puts "#{msg} - reason: #{PhysicsFS.last_error}" end # # parse line to command and args # def parse line return false if line.nil? if line.strip =~ /^(.*?) (?: (?:\s+(.*)) | $)/x run $1, $2 else false end end # # parse command args # def parse_args args args.strip! dquoted = /^ " (.*?) "/x squoted = /^ ' (.*?) '/x unquoted = /^([^\s\'\"]+)/ regexps = [dquoted, squoted, unquoted] result = [] while args != "" regexps.each do |r| if args =~ r result << $1 args.sub! r, "" args.sub!(/\s+/, "") break end end end result end def usage cmd, prefix = "usage: " print prefix args = Commands::HELP[cmd] if args print cmd args.scan(/\w+/).each {|x| print " <#{x}>" } puts else puts %|#{cmd} (no arguments)| end end # commands go below module Commands HELP = { "init" => "argv0", "addarchive" => "archiveLocation append", "removearchive" => "archiveLocation", "enumerate" => "dirToEnumerate", "ls" => "dirToEnumerate", "setwritedir" => "newWriteDir", "permitsymlinks" => "1or0", "setsaneconfig" => "org appName arcExt includeCdRoms archivesFirst", "mkdir" => "dirToMk", "delete" => "dirToDelete", "getrealdir" => "fileToFind", "exists" => "fileToCheck", "isdir" => "fileToCheck", "issymlink" => "fileToCheck", "cat" => "fileToCat", "filelength" => "fileToCheck", "append" => "fileToAppend", "write" => "fileToCreateOrTrash", "getlastmodtime" => "fileToExamine" } def quit_cmd exit end alias q_cmd quit_cmd def help_cmd commands = ::Commands.instance_methods.grep(/_cmd$/).sort puts "Commands:" commands.each do |c| usage c.sub("_cmd", ""), " - " end true end def e val if val puts "Successful." else puts "Failure. reason: #{PhysicsFS.last_error}" end true end def init_cmd arg e PhysicsFS.init(arg) end def deinit_cmd e PhysicsFS.deinit end def addarchive_cmd archive, append e PhysicsFS.add_to_search_path(archive, append) end def removearchive_cmd archive e PhysicsFS.remove_from_search_path archive end def enumerate_cmd path entries = PhysicsFS.enumerate(path) entries.each {|x| puts x } true end alias ls_cmd enumerate_cmd def getlasterror_cmd puts "Last error is [#{PhysicsFS.last_error}]" true end def getdirsep_cmd puts "Directory separator is [#{PhysicsFS.dir_separator}]" true end def getcdromdirs_cmd dirs = PhysicsFS.cdrom_dirs dirs.each {|x| puts x } puts " total [#{dirs.length}] drives." true end def getsearchpath_cmd spath = PhysicsFS.search_path spath.each {|x| puts x } puts "total [#{spath.length}] directories." true end def getbasedir_cmd dir = PhysicsFS.base_dir puts dir if dir true end def getuserdir_cmd puts PhysicsFS.user_dir true end def getwritedir_cmd dir = PhysicsFS.write_dir if dir puts "Write directory is [#{dir}]." else puts "No write directory defined." end true end def setwritedir_cmd dir e(PhysicsFS.write_dir = dir) end def permitsymlinks_cmd val if val.to_i == 1 PhysicsFS.permit_symlinks true puts "Symlinks are now permitted" else PhysicsFS.permit_symlinks false puts "Symlinks are now forbidden" end true end def setsaneconfig_cmd org, appname, ext, includeCdroms, archivesFirst includeCdroms = includeCdroms.to_i == 1 archiveFirst = archivesFirst == 1 e PhysicsFS.set_sane_config(org, appname, ext, includeCdroms, archivesFirst) end def mkdir_cmd dir e PhysicsFS.mkdir(dir) end def delete_cmd dir e PhysicsFS.delete(dir) end def getrealdir_cmd file dir = PhysicsFS.real_dir file if dir puts "Found at [#{dir}]" else puts "Not found." end true end def exists_cmd file if PhysicsFS.exists? file puts "File exists" else puts "File does not exist" end true end def isdir_cmd file if PhysicsFS.is_directory? file puts "File is a directory" else puts "File is NOT a directory" end true end def issymlink_cmd file if PhysicsFS.is_symlink? file puts "File is a symlink" else puts "File is NOT a symlink" end true end def cat_cmd filename file = PhysicsFS.open_read filename if file.nil? puts "failed to open. reason: #{PhysicsFS.last_error}" return true end puts file.cat true end def filelength_cmd filename file = PhysicsFS.open_read filename if file.nil? puts "failed to open. reason: #{PhysicsFS.last_error}" return true end puts file.length file.close true end WRITE_STR = "Rubyfied PhysicsFS works just fine.\n\n" def append_cmd filename file = PhysicsFS.open_append filename if file.nil? puts "failed to open. reason: #{PhysicsFS.last_error}" return true end file.write WRITE_STR, 1, WRITE_STR.length file.close true end def write_cmd filename file = PhysicsFS.open_write filename if file.nil? puts "failed to open. reason: #{PhysicsFS.last_error}" return true end file.write_str WRITE_STR file.close true end def getlastmodtime_cmd filename t = PhysicsFS.last_mod_time filename if t == -1 puts "failed to determin. reason: #{PhysicsFS.last_error}" else puts "Last modified: #{Time.at(t)}" end true end end include Commands def run command, args if args args = parse_args args else args = [] end begin cmd = method "#{command}_cmd" if args.length == cmd.arity return cmd.call *args else usage command true end rescue NameError puts 'Unknown command. Enter "help" for instructions.' true end end if __FILE__ == $0 PhysicsFS.init($0) or die "PhysicsFS init failed" puts "PhysicsFS version: #{PhysicsFS.version}" puts puts "Supported archives: " puts PhysicsFS.supported_archives puts puts 'Enter commands. Enter "help" for instructions.' loop { line = Readline::readline "physfs_rb> ", true break unless parse line } end