mspack_rb 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +6 -0
- data/README.md +21 -0
- data/Rakefile +11 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/mspack/extconf.rb +25 -0
- data/ext/mspack/mspack.c +113 -0
- data/lib/mspack/version.rb +3 -0
- data/lib/mspack.rb +12 -0
- data/mspack.gemspec +31 -0
- metadata +129 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 9b07279e9c4e97916854a86935c3e76358e6c0aa
|
4
|
+
data.tar.gz: 58541deec596d6386c6a7899ade3d0497964d095
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 36db54a01cc0b420f6ecd1907a44a4294948d591a67d625647060db8ed4f7d0ec85ce29940c202b743cd7c8ea4076bea6b79fd66235d24bceb76dcf761a3bb45
|
7
|
+
data.tar.gz: 4bf5a16eef7b01be7ebacd12b3638127b3702598fe054212008cc2e0d433586cf893cbb7b28a12d772201eb8ba24deee6b6274642743bd9b20c11aa11cb4e1df
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# MspackRb
|
2
|
+
|
3
|
+
### A simple Ruby native extension gem wrapper for [libmspack](https://www.cabextract.org.uk/libmspack/)
|
4
|
+
|
5
|
+
Requires libmspack to be installed.
|
6
|
+
|
7
|
+
Currently, only (very) basic CHM extraction has been implemented.
|
8
|
+
|
9
|
+
### Usage:
|
10
|
+
require 'mspack_rb'
|
11
|
+
|
12
|
+
dcom = Mspack::ChmDecompressor.new
|
13
|
+
header = dcom.open('path/to/a/chm/file')
|
14
|
+
file = header.files
|
15
|
+
out_dir = 'some/output/directory'
|
16
|
+
|
17
|
+
while !file.nil?
|
18
|
+
out_path = "#{out_dir}/#{file.filename}"
|
19
|
+
dcom.extract(file, out_path)
|
20
|
+
file = file.next
|
21
|
+
end
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "mspack_rb"
|
5
|
+
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
8
|
+
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
+
# require "pry"
|
11
|
+
# Pry.start
|
12
|
+
|
13
|
+
require "irb"
|
14
|
+
IRB.start
|
data/bin/setup
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
LIB_NAME = 'mspack'
|
4
|
+
|
5
|
+
LIB_FUNCTION = 'mspack_version'
|
6
|
+
|
7
|
+
HEADER_DIRS = [
|
8
|
+
'/usr/local/include', # homebrew / from source
|
9
|
+
RbConfig::CONFIG['includedir'], # ruby install locations
|
10
|
+
'/usr/include' # fallback
|
11
|
+
]
|
12
|
+
|
13
|
+
LIB_DIRS = [
|
14
|
+
'/usr/local/lib', # homebrew / from source
|
15
|
+
RbConfig::CONFIG['libdir'], # ruby install locations
|
16
|
+
'/usr/lib' # fallback
|
17
|
+
]
|
18
|
+
|
19
|
+
dir_config(LIB_NAME, HEADER_DIRS, LIB_DIRS)
|
20
|
+
|
21
|
+
unless find_header("#{LIB_NAME}.h") && find_library(LIB_NAME, LIB_FUNCTION)
|
22
|
+
abort "lib#{LIB_NAME} not found"
|
23
|
+
end
|
24
|
+
|
25
|
+
create_makefile(LIB_NAME)
|
data/ext/mspack/mspack.c
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
#include <mspack.h>
|
2
|
+
#include <ruby.h>
|
3
|
+
|
4
|
+
VALUE Mspack = Qnil;
|
5
|
+
VALUE ChmDecom = Qnil;
|
6
|
+
VALUE ChmDHeader = Qnil;
|
7
|
+
VALUE ChmDFile = Qnil;
|
8
|
+
|
9
|
+
VALUE mspack_test() {
|
10
|
+
int result;
|
11
|
+
MSPACK_SYS_SELFTEST(result);
|
12
|
+
return result == MSPACK_ERR_OK ? Qtrue : Qfalse;
|
13
|
+
}
|
14
|
+
|
15
|
+
void chmd_deallocate(void *decom) {
|
16
|
+
mspack_destroy_chm_decompressor(decom);
|
17
|
+
}
|
18
|
+
|
19
|
+
static VALUE chmd_allocate(VALUE self) {
|
20
|
+
struct mschm_decompressor *decom = mspack_create_chm_decompressor(NULL);
|
21
|
+
return Data_Wrap_Struct(self, NULL, chmd_deallocate, decom);
|
22
|
+
}
|
23
|
+
|
24
|
+
static VALUE chmd_open(VALUE self, VALUE path) {
|
25
|
+
struct mschm_decompressor *decom;
|
26
|
+
Data_Get_Struct(self, struct mschm_decompressor, decom);
|
27
|
+
struct mschmd_header *header = decom->open(decom, StringValueCStr(path));
|
28
|
+
|
29
|
+
if (!header) {
|
30
|
+
return Qnil;
|
31
|
+
}
|
32
|
+
|
33
|
+
VALUE headerObj = rb_obj_alloc(ChmDHeader);
|
34
|
+
rb_obj_call_init(headerObj, 0, NULL);
|
35
|
+
return Data_Wrap_Struct(ChmDHeader, NULL, NULL, header);
|
36
|
+
}
|
37
|
+
|
38
|
+
static VALUE chmd_close(VALUE self, VALUE header) {
|
39
|
+
struct mschm_decompressor *decom;
|
40
|
+
Data_Get_Struct(self, struct mschm_decompressor, decom);
|
41
|
+
|
42
|
+
struct mschmd_header *headerPtr;
|
43
|
+
Data_Get_Struct(header, struct mschmd_header, headerPtr);
|
44
|
+
|
45
|
+
decom->close(decom, headerPtr);
|
46
|
+
return Qnil;
|
47
|
+
}
|
48
|
+
|
49
|
+
static VALUE chmd_extract(VALUE self, VALUE file, VALUE outputPath) {
|
50
|
+
struct mschm_decompressor *decom;
|
51
|
+
Data_Get_Struct(self, struct mschm_decompressor, decom);
|
52
|
+
|
53
|
+
struct mschmd_file *filePtr;
|
54
|
+
Data_Get_Struct(file, struct mschmd_file, filePtr);
|
55
|
+
|
56
|
+
const char *pathStr = StringValueCStr(outputPath);
|
57
|
+
return decom->extract(decom, filePtr, pathStr) == MSPACK_ERR_OK ?
|
58
|
+
Qtrue : Qfalse;
|
59
|
+
}
|
60
|
+
|
61
|
+
static VALUE chmd_header_filename(VALUE self) {
|
62
|
+
struct mschmd_header *header;
|
63
|
+
Data_Get_Struct(self, struct mschmd_header, header);
|
64
|
+
return rb_str_new2(header->filename);
|
65
|
+
}
|
66
|
+
|
67
|
+
static VALUE chmd_header_files(VALUE self) {
|
68
|
+
struct mschmd_header *header;
|
69
|
+
Data_Get_Struct(self, struct mschmd_header, header);
|
70
|
+
|
71
|
+
VALUE fileObj = rb_obj_alloc(ChmDFile);
|
72
|
+
rb_obj_call_init(fileObj, 0, NULL);
|
73
|
+
return Data_Wrap_Struct(ChmDFile, NULL, NULL, header->files);
|
74
|
+
}
|
75
|
+
|
76
|
+
static VALUE chmd_file_filename(VALUE self) {
|
77
|
+
struct mschmd_file *file;
|
78
|
+
Data_Get_Struct(self, struct mschmd_file, file);
|
79
|
+
return rb_str_new2(file->filename);
|
80
|
+
}
|
81
|
+
|
82
|
+
static VALUE chmd_file_next(VALUE self) {
|
83
|
+
struct mschmd_file *file;
|
84
|
+
Data_Get_Struct(self, struct mschmd_file, file);
|
85
|
+
struct mschmd_file *next = file->next;
|
86
|
+
|
87
|
+
if (next == NULL) {
|
88
|
+
return Qnil;
|
89
|
+
}
|
90
|
+
|
91
|
+
VALUE nextObj = rb_obj_alloc(ChmDFile);
|
92
|
+
rb_obj_call_init(nextObj, 0, NULL);
|
93
|
+
return Data_Wrap_Struct(ChmDFile, NULL, NULL, next);
|
94
|
+
}
|
95
|
+
|
96
|
+
void Init_mspack() {
|
97
|
+
Mspack = rb_define_module("Mspack");
|
98
|
+
rb_define_singleton_method(Mspack, "test", mspack_test, 0);
|
99
|
+
|
100
|
+
ChmDecom = rb_define_class_under(Mspack, "ChmDecompressor", rb_cObject);
|
101
|
+
rb_define_alloc_func(ChmDecom, chmd_allocate);
|
102
|
+
rb_define_method(ChmDecom, "open", chmd_open, 1);
|
103
|
+
rb_define_method(ChmDecom, "close", chmd_close, 1);
|
104
|
+
rb_define_method(ChmDecom, "extract", chmd_extract, 2);
|
105
|
+
|
106
|
+
ChmDHeader = rb_define_class_under(ChmDecom, "Header", rb_cObject);
|
107
|
+
rb_define_method(ChmDHeader, "filename", chmd_header_filename, 0);
|
108
|
+
rb_define_method(ChmDHeader, "files", chmd_header_files, 0);
|
109
|
+
|
110
|
+
ChmDFile = rb_define_class_under(ChmDecom, "File", rb_cObject);
|
111
|
+
rb_define_method(ChmDFile, "filename", chmd_file_filename, 0);
|
112
|
+
rb_define_method(ChmDFile, "next", chmd_file_next, 0);
|
113
|
+
}
|
data/lib/mspack.rb
ADDED
data/mspack.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'mspack/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "mspack_rb"
|
8
|
+
spec.version = Mspack::VERSION
|
9
|
+
spec.authors = ["Ben Williams"]
|
10
|
+
spec.email = ["8enwilliams@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = 'A ruby gem wrapper for libmspack'
|
13
|
+
spec.description = 'A ruby gem wrapper for libmspack'
|
14
|
+
spec.homepage = 'https://github.com/benjineering/mspack_rb'
|
15
|
+
|
16
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
|
+
f.match(%r{^(test|spec|features)/})
|
20
|
+
end
|
21
|
+
spec.bindir = "exe"
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ["lib"]
|
24
|
+
spec.extensions << 'ext/mspack/extconf.rb'
|
25
|
+
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.13"
|
27
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
28
|
+
spec.add_development_dependency "rake-compiler", "~> 1.0"
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
30
|
+
spec.add_development_dependency "guard-rspec", "~> 4.7"
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mspack_rb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Williams
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.13'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake-compiler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.7'
|
83
|
+
description: A ruby gem wrapper for libmspack
|
84
|
+
email:
|
85
|
+
- 8enwilliams@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions:
|
88
|
+
- ext/mspack/extconf.rb
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".travis.yml"
|
94
|
+
- Gemfile
|
95
|
+
- Guardfile
|
96
|
+
- README.md
|
97
|
+
- Rakefile
|
98
|
+
- bin/console
|
99
|
+
- bin/setup
|
100
|
+
- ext/mspack/extconf.rb
|
101
|
+
- ext/mspack/mspack.c
|
102
|
+
- lib/mspack.rb
|
103
|
+
- lib/mspack/version.rb
|
104
|
+
- mspack.gemspec
|
105
|
+
homepage: https://github.com/benjineering/mspack_rb
|
106
|
+
licenses: []
|
107
|
+
metadata:
|
108
|
+
allowed_push_host: https://rubygems.org
|
109
|
+
post_install_message:
|
110
|
+
rdoc_options: []
|
111
|
+
require_paths:
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 2.5.1
|
126
|
+
signing_key:
|
127
|
+
specification_version: 4
|
128
|
+
summary: A ruby gem wrapper for libmspack
|
129
|
+
test_files: []
|