nispack 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.markdown +10 -0
- data/Rakefile +1 -0
- data/bin/nispack +70 -0
- data/lib/nispack.rb +98 -0
- data/nispack.gemspec +24 -0
- metadata +71 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/nispack
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "nispack"
|
3
|
+
require "getopt/long"
|
4
|
+
|
5
|
+
def help
|
6
|
+
puts "nispack tool by tonypolik"
|
7
|
+
puts "version: #{Nispack::VERSION}"
|
8
|
+
puts " Usage:"
|
9
|
+
puts " nispack -f file.dat -e file1 -e file2"
|
10
|
+
puts " extract file1 and file2 from file.dat"
|
11
|
+
puts " nispack -f file.dat -u"
|
12
|
+
puts " extract ALL files from file.dat in a default directory"
|
13
|
+
puts " nispack -f file.dat -u -d dir"
|
14
|
+
puts " extract all files from file.dat in a directory named dir"
|
15
|
+
puts " nispack -f file.dat -c"
|
16
|
+
puts " create a new nispack file named file.dat using all files in the current directory"
|
17
|
+
puts " nispack -f file.dat -c -d dir"
|
18
|
+
puts " create a new nispack file named file.dat using all files in the 'dir' directory"
|
19
|
+
exit
|
20
|
+
end
|
21
|
+
|
22
|
+
help if ARGV == []
|
23
|
+
|
24
|
+
opts = Getopt::Long.getopts(
|
25
|
+
["--help", "-h", Getopt::BOOLEAN],
|
26
|
+
["--file", "-f", Getopt::REQUIRED],
|
27
|
+
["--unpack", "-u", Getopt::BOOLEAN],
|
28
|
+
["--extract", "-e", Getopt::REQUIRED],
|
29
|
+
["--create", "-c", Getopt::BOOLEAN],
|
30
|
+
["--dir", "-d", Getopt::REQUIRED]
|
31
|
+
)
|
32
|
+
|
33
|
+
help if opts["help"]
|
34
|
+
|
35
|
+
unless opts.has_key?("file")
|
36
|
+
raise "Must use the -f or --file flag to select a nispack file to read or create."
|
37
|
+
end
|
38
|
+
|
39
|
+
a, b, c = "extract", "create", "unpack"
|
40
|
+
3.times do
|
41
|
+
if opts.has_key?(a) and (opts.has_key?(b) or opts.has_key?(c))
|
42
|
+
raise "Can't use --#{a} with --#{b} or -- {c}"
|
43
|
+
end
|
44
|
+
x=a; a=b; b=c; c=x
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
if opts["extract"] and opts["dir"]
|
49
|
+
raise "Can't use --dir with --extract"
|
50
|
+
end
|
51
|
+
|
52
|
+
case opts["extract"]
|
53
|
+
when String; Nispack.open(opts["file"]) {|n| n.extract(opts["extract"])}
|
54
|
+
when Array; opts["extract"].each {|x| Nispack.open(opts["file"]) {|n| n.extract(x)}}
|
55
|
+
end
|
56
|
+
|
57
|
+
if opts["unpack"]
|
58
|
+
case opts["dir"]
|
59
|
+
when nil; Nispack.open(opts["file"]) {|n| n.extract_all}
|
60
|
+
else; Nispack.open(opts["file"]) {|n| n.extract_all(opts["dir"])}
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if opts["create"]
|
65
|
+
case opts["dir"]
|
66
|
+
when nil; Nispack.create_from_directory(:name => opts["file"])
|
67
|
+
else; Nispack.create_from_directory(:name => opts["file"], :dir => opts["dir"])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
data/lib/nispack.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
|
3
|
+
|
4
|
+
class Nispack
|
5
|
+
|
6
|
+
VERSION = "1.0.0"
|
7
|
+
SIGNATURE = "NISPACK\0\0\0\0\0".force_encoding("binary")
|
8
|
+
|
9
|
+
attr_reader :filename
|
10
|
+
attr_reader :file
|
11
|
+
attr_reader :entries
|
12
|
+
|
13
|
+
def initialize(name, file, entries)
|
14
|
+
@name = name
|
15
|
+
@file = file
|
16
|
+
@entries = entries
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.open(filename)
|
20
|
+
name = File.basename(filename)
|
21
|
+
file = File.new(filename, "rb")
|
22
|
+
if file.read(SIGNATURE.bytesize) != SIGNATURE
|
23
|
+
raise "#{filename} is not a Nispack: wrong signature."
|
24
|
+
end
|
25
|
+
n_entries = file.read(4).unpack('l')[0]
|
26
|
+
entries = Array.new(n_entries)
|
27
|
+
entries.map! do |entry|
|
28
|
+
entry = Hash.new
|
29
|
+
entry[:name] = file.read(32).strip
|
30
|
+
entry[:start] = file.read(4).unpack('l')[0]
|
31
|
+
entry[:size] = file.read(4).unpack('l')[0]
|
32
|
+
file.pos += 4
|
33
|
+
entry
|
34
|
+
end
|
35
|
+
file.pos = 0
|
36
|
+
nispack = self.new(name, file, entries)
|
37
|
+
if block_given?
|
38
|
+
yield nispack
|
39
|
+
nispack.close
|
40
|
+
else
|
41
|
+
return nispack
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def close
|
46
|
+
@file.close
|
47
|
+
end
|
48
|
+
|
49
|
+
def extract_all(dir = File.basename(@name).chomp(File.extname(@name)))
|
50
|
+
old_dir = Dir.pwd
|
51
|
+
FileUtils.mkdir_p(dir)
|
52
|
+
FileUtils.cd(dir)
|
53
|
+
@entries.each {|entry| extract_entry(entry)}
|
54
|
+
FileUtils.cd(old_dir)
|
55
|
+
end
|
56
|
+
|
57
|
+
def extract(name)
|
58
|
+
entry = @entries.select{|x| x[:name] == name}.first
|
59
|
+
if entry.nil?
|
60
|
+
raise "Can't extract #{name}: not in the Nispack archive"
|
61
|
+
end
|
62
|
+
extract_entry(entry)
|
63
|
+
end
|
64
|
+
|
65
|
+
def extract_entry(entry)
|
66
|
+
File.open(entry[:name], "wb") do |out|
|
67
|
+
@file.pos = entry[:start]
|
68
|
+
out.write(@file.read(entry[:size]))
|
69
|
+
@file.pos = 0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private :extract_entry
|
74
|
+
|
75
|
+
def self.create_from_directory(options)
|
76
|
+
dir = options[:dir] || Dir.pwd
|
77
|
+
name = options[:name] || File.basename(Dir.pwd) + ".DAT"
|
78
|
+
files = Dir.entries(dir).select{|f| File.file?(File.join(dir, f))}
|
79
|
+
out = File.new(name, "wb+")
|
80
|
+
out.write(SIGNATURE)
|
81
|
+
out.write([files.size].pack("l"))
|
82
|
+
start = 16 + 44 * files.size
|
83
|
+
files.each do |f|
|
84
|
+
out.write([f].pack("a32"))
|
85
|
+
out.write([start].pack("l"))
|
86
|
+
size = File.size(File.join(dir, f))
|
87
|
+
out.write([size].pack("l"))
|
88
|
+
out.write([0].pack("l"))
|
89
|
+
start += size
|
90
|
+
end
|
91
|
+
files.each do |f|
|
92
|
+
out.write(IO.binread(File.join(dir, f)))
|
93
|
+
end
|
94
|
+
out.close
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
end
|
data/nispack.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "nispack"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "nispack"
|
7
|
+
s.version = Nispack::VERSION
|
8
|
+
s.authors = ["tonypolik"]
|
9
|
+
s.email = ["tonypolik@gmail.com"]
|
10
|
+
s.homepage = "https://github.com/tonypolik"
|
11
|
+
s.summary = %q{Easy handling of NISPACK files.}
|
12
|
+
s.description = %q{Easy handling of NISPACK files. You can extract the files or create a new archive from a directory.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "nispack"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
s.add_runtime_dependency "getopt"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nispack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- tonypolik
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-09-26 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: getopt
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
description: Easy handling of NISPACK files. You can extract the files or create a new archive from a directory.
|
27
|
+
email:
|
28
|
+
- tonypolik@gmail.com
|
29
|
+
executables:
|
30
|
+
- nispack
|
31
|
+
extensions: []
|
32
|
+
|
33
|
+
extra_rdoc_files: []
|
34
|
+
|
35
|
+
files:
|
36
|
+
- .gitignore
|
37
|
+
- Gemfile
|
38
|
+
- README.markdown
|
39
|
+
- Rakefile
|
40
|
+
- bin/nispack
|
41
|
+
- lib/nispack.rb
|
42
|
+
- nispack.gemspec
|
43
|
+
homepage: https://github.com/tonypolik
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: "0"
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project: nispack
|
66
|
+
rubygems_version: 1.8.10
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: Easy handling of NISPACK files.
|
70
|
+
test_files: []
|
71
|
+
|