rubysl-dbm 2.0.1
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 +17 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/ext/rubysl/dbm/dbm.c +1042 -0
- data/ext/rubysl/dbm/extconf.rb +286 -0
- data/lib/dbm.rb +1 -0
- data/lib/rubysl/dbm.rb +2 -0
- data/lib/rubysl/dbm/version.rb +5 -0
- data/rubysl-dbm.gemspec +23 -0
- metadata +100 -0
@@ -0,0 +1,286 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
dir_config("dbm")
|
4
|
+
|
5
|
+
if dblib = with_config("dbm-type", nil)
|
6
|
+
dblib = dblib.split(/[ ,]+/)
|
7
|
+
else
|
8
|
+
dblib = %w(libc db db2 db1 db5 db4 db3 dbm gdbm gdbm_compat qdbm)
|
9
|
+
end
|
10
|
+
|
11
|
+
headers = {
|
12
|
+
"libc" => ["ndbm.h"], # 4.4BSD libc contains Berkeley DB 1.
|
13
|
+
"db" => ["db.h"],
|
14
|
+
"db1" => ["db1/ndbm.h", "db1.h", "ndbm.h"],
|
15
|
+
"db2" => ["db2/db.h", "db2.h", "db.h"],
|
16
|
+
"db3" => ["db3/db.h", "db3.h", "db.h"],
|
17
|
+
"db4" => ["db4/db.h", "db4.h", "db.h"],
|
18
|
+
"db5" => ["db5/db.h", "db5.h", "db.h"],
|
19
|
+
"dbm" => ["ndbm.h"], # traditional ndbm (4.3BSD)
|
20
|
+
"gdbm" => ["gdbm-ndbm.h", "ndbm.h", "gdbm/ndbm.h"], # gdbm until 1.8.0
|
21
|
+
"gdbm_compat" => ["gdbm-ndbm.h", "ndbm.h", "gdbm/ndbm.h"], # gdbm since 1.8.1
|
22
|
+
"qdbm" => ["relic.h", "qdbm/relic.h"],
|
23
|
+
}
|
24
|
+
|
25
|
+
class << headers
|
26
|
+
attr_accessor :found
|
27
|
+
attr_accessor :defs
|
28
|
+
end
|
29
|
+
headers.found = []
|
30
|
+
headers.defs = nil
|
31
|
+
|
32
|
+
def headers.db_check(db, hdr)
|
33
|
+
old_libs = $libs.dup
|
34
|
+
old_defs = $defs.dup
|
35
|
+
result = db_check2(db, hdr)
|
36
|
+
if !result
|
37
|
+
$libs = old_libs
|
38
|
+
$defs = old_defs
|
39
|
+
end
|
40
|
+
result
|
41
|
+
end
|
42
|
+
|
43
|
+
# BEGIN BACKPORTED FROM 2.0
|
44
|
+
class String
|
45
|
+
# Wraps a string in escaped quotes if it contains whitespace.
|
46
|
+
def quote
|
47
|
+
/\s/ =~ self ? "\"#{self}\"" : "#{self}"
|
48
|
+
end
|
49
|
+
|
50
|
+
# Generates a string used as cpp macro name.
|
51
|
+
def tr_cpp
|
52
|
+
strip.upcase.tr_s("^A-Z0-9_*", "_").tr_s("*", "P")
|
53
|
+
end
|
54
|
+
|
55
|
+
def funcall_style
|
56
|
+
/\)\z/ =~ self ? dup : "#{self}()"
|
57
|
+
end
|
58
|
+
|
59
|
+
def sans_arguments
|
60
|
+
self[/\A[^()]+/]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def rm_f(*files)
|
65
|
+
opt = (Hash === files.last ? [files.pop] : [])
|
66
|
+
FileUtils.rm_f(Dir[*files.flatten], *opt)
|
67
|
+
end
|
68
|
+
|
69
|
+
def try_func(func, libs, headers = nil, opt = "", &b)
|
70
|
+
headers = cpp_include(headers)
|
71
|
+
case func
|
72
|
+
when /^&/
|
73
|
+
decltype = proc {|x|"const volatile void *#{x}"}
|
74
|
+
when /\)$/
|
75
|
+
call = func
|
76
|
+
else
|
77
|
+
call = "#{func}()"
|
78
|
+
decltype = proc {|x| "void ((*#{x})())"}
|
79
|
+
end
|
80
|
+
if opt and !opt.empty?
|
81
|
+
[[:to_str], [:join, " "], [:to_s]].each do |meth, *args|
|
82
|
+
if opt.respond_to?(meth)
|
83
|
+
break opt = opt.send(meth, *args)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
opt = "#{opt} #{libs}"
|
87
|
+
else
|
88
|
+
opt = libs
|
89
|
+
end
|
90
|
+
decltype && try_link(<<"SRC", opt, &b) or
|
91
|
+
#{headers}
|
92
|
+
/*top*/
|
93
|
+
#{MAIN_DOES_NOTHING}
|
94
|
+
extern int t(void);
|
95
|
+
int t(void) { #{decltype["volatile p"]}; p = (#{decltype[]})#{func}; return 0; }
|
96
|
+
SRC
|
97
|
+
call && try_link(<<"SRC", opt, &b)
|
98
|
+
#{headers}
|
99
|
+
/*top*/
|
100
|
+
#{MAIN_DOES_NOTHING}
|
101
|
+
extern int t(void);
|
102
|
+
int t(void) { #{call}; return 0; }
|
103
|
+
SRC
|
104
|
+
end
|
105
|
+
|
106
|
+
def try_var(var, headers = nil, opt = "", &b)
|
107
|
+
headers = cpp_include(headers)
|
108
|
+
try_compile(<<"SRC", opt, &b)
|
109
|
+
#{headers}
|
110
|
+
/*top*/
|
111
|
+
#{MAIN_DOES_NOTHING}
|
112
|
+
extern int t(void);
|
113
|
+
int t(void) { const volatile void *volatile p; p = &(&#{var})[0]; return 0; }
|
114
|
+
SRC
|
115
|
+
end
|
116
|
+
|
117
|
+
def have_library(lib, func = nil, headers = nil, opt = "", &b)
|
118
|
+
func = "main" if !func or func.empty?
|
119
|
+
lib = with_config(lib+'lib', lib)
|
120
|
+
checking_for checking_message(func.funcall_style, LIBARG%lib, opt) do
|
121
|
+
if COMMON_LIBS.include?(lib)
|
122
|
+
true
|
123
|
+
else
|
124
|
+
libs = append_library($libs, lib)
|
125
|
+
if try_func(func, libs, headers, opt, &b)
|
126
|
+
$libs = libs
|
127
|
+
true
|
128
|
+
else
|
129
|
+
false
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def have_func(func, headers = nil, opt = "", &b)
|
136
|
+
checking_for checking_message(func.funcall_style, headers, opt) do
|
137
|
+
if try_func(func, $libs, headers, opt, &b)
|
138
|
+
$defs << "-DHAVE_#{func.sans_arguments.tr_cpp}"
|
139
|
+
true
|
140
|
+
else
|
141
|
+
false
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def have_var(var, headers = nil, opt = "", &b)
|
147
|
+
checking_for checking_message(var, headers, opt) do
|
148
|
+
if try_var(var, headers, opt, &b)
|
149
|
+
$defs.push(format("-DHAVE_%s", var.tr_cpp))
|
150
|
+
true
|
151
|
+
else
|
152
|
+
false
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def try_cpp(src, opt="", *opts, &b)
|
158
|
+
try_do(src, cpp_command(CPPOUTFILE, opt), *opts, &b)
|
159
|
+
ensure
|
160
|
+
rm_f "conftest*"
|
161
|
+
end
|
162
|
+
|
163
|
+
alias :try_header :try_cpp
|
164
|
+
|
165
|
+
def have_header(header, preheaders = nil, opt = "", &b)
|
166
|
+
checking_for header do
|
167
|
+
if try_header(cpp_include(preheaders)+cpp_include(header), opt, &b)
|
168
|
+
$defs.push(format("-DHAVE_%s", header.tr_cpp))
|
169
|
+
true
|
170
|
+
else
|
171
|
+
false
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def convertible_int(type, headers = nil, opts = nil, &b)
|
177
|
+
type, macname = *type
|
178
|
+
checking_for("convertible type of #{type}", STRING_OR_FAILED_FORMAT) do
|
179
|
+
if UNIVERSAL_INTS.include?(type)
|
180
|
+
type
|
181
|
+
else
|
182
|
+
typedef, member, prelude = typedef_expr(type, headers, &b)
|
183
|
+
if member
|
184
|
+
prelude << "static rbcv_typedef_ rbcv_var;"
|
185
|
+
compat = UNIVERSAL_INTS.find {|t|
|
186
|
+
try_static_assert("sizeof(rbcv_var.#{member}) == sizeof(#{t})", [prelude], opts, &b)
|
187
|
+
}
|
188
|
+
else
|
189
|
+
next unless signed = try_signedness(typedef, member, [prelude])
|
190
|
+
u = "unsigned " if signed > 0
|
191
|
+
prelude << "extern rbcv_typedef_ foo();"
|
192
|
+
compat = UNIVERSAL_INTS.find {|t|
|
193
|
+
try_compile([prelude, "extern #{u}#{t} foo();"].join("\n"), opts, :werror=>true, &b)
|
194
|
+
}
|
195
|
+
end
|
196
|
+
if compat
|
197
|
+
macname ||= type.sub(/_(?=t\z)/, '').tr_cpp
|
198
|
+
conv = (compat == "long long" ? "LL" : compat.upcase)
|
199
|
+
compat = "#{u}#{compat}"
|
200
|
+
typename = type.tr_cpp
|
201
|
+
$defs.push(format("-DSIZEOF_%s=SIZEOF_%s", typename, compat.tr_cpp))
|
202
|
+
$defs.push(format("-DTYPEOF_%s=%s", typename, compat.quote))
|
203
|
+
$defs.push(format("-DPRI_%s_PREFIX=PRI_%s_PREFIX", macname, conv))
|
204
|
+
conv = (u ? "U" : "") + conv
|
205
|
+
$defs.push(format("-D%s2NUM=%s2NUM", macname, conv))
|
206
|
+
$defs.push(format("-DNUM2%s=NUM2%s", macname, conv))
|
207
|
+
compat
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
# END BACKPORTED FROM 2.0
|
213
|
+
|
214
|
+
def have_libvar(var, headers = nil, opt = "", &b)
|
215
|
+
checking_for checking_message([*var].compact.join(' '), headers, opt) do
|
216
|
+
try_libvar(var, headers, opt, &b)
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def try_libvar(var, headers = nil, opt = "", &b)
|
221
|
+
var, type = *var
|
222
|
+
if try_link(<<"SRC", opt, &b)
|
223
|
+
#{cpp_include(headers)}
|
224
|
+
/*top*/
|
225
|
+
int main(int argc, char *argv[]) {
|
226
|
+
typedef #{type || 'int'} conftest_type;
|
227
|
+
extern conftest_type #{var};
|
228
|
+
conftest_type *conftest_var = &#{var};
|
229
|
+
return 0;
|
230
|
+
}
|
231
|
+
SRC
|
232
|
+
$defs.push(format("-DHAVE_LIBVAR_%s", var.tr_cpp))
|
233
|
+
true
|
234
|
+
else
|
235
|
+
false
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
|
240
|
+
def headers.db_check2(db, hdr)
|
241
|
+
hsearch = nil
|
242
|
+
|
243
|
+
case db
|
244
|
+
when /^db[2-5]?$/
|
245
|
+
hsearch = "-DDB_DBM_HSEARCH"
|
246
|
+
when "gdbm_compat"
|
247
|
+
have_library("gdbm") or return false
|
248
|
+
end
|
249
|
+
|
250
|
+
if have_type("DBM", hdr, hsearch) and
|
251
|
+
(db == 'libc' ? have_func('dbm_open("", 0, 0)', hdr, hsearch) :
|
252
|
+
have_library(db, 'dbm_open("", 0, 0)', hdr, hsearch)) and
|
253
|
+
have_func('dbm_clearerr((DBM *)0)', hdr, hsearch) and
|
254
|
+
(/\Adb\d?\z/ =~ db || db == 'libc' || !have_macro('_DB_H_', hdr, hsearch)) # _DB_H_ should not be defined except Berkeley DB.
|
255
|
+
case db
|
256
|
+
when /\Adb\d?\z/
|
257
|
+
have_func('db_version((int *)0, (int *)0, (int *)0)', hdr, hsearch)
|
258
|
+
when /\Agdbm/
|
259
|
+
have_var("gdbm_version", hdr, hsearch)
|
260
|
+
# gdbm_version is not declared by ndbm.h until gdbm 1.8.3.
|
261
|
+
# We can't include ndbm.h and gdbm.h because they both define datum type.
|
262
|
+
# ndbm.h includes gdbm.h and gdbm_version is declared since gdbm 1.9.
|
263
|
+
have_libvar(["gdbm_version", "char *"], hdr, hsearch)
|
264
|
+
when /\Aqdbm\z/
|
265
|
+
have_var("dpversion", hdr, hsearch)
|
266
|
+
end
|
267
|
+
if hsearch
|
268
|
+
$defs << hsearch
|
269
|
+
@defs = hsearch
|
270
|
+
end
|
271
|
+
$defs << '-DDBM_HDR="<'+hdr+'>"'
|
272
|
+
@found << hdr
|
273
|
+
true
|
274
|
+
else
|
275
|
+
false
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
if dblib.any? {|db| headers.fetch(db, ["ndbm.h"]).any? {|hdr| headers.db_check(db, hdr) } }
|
280
|
+
have_header("cdefs.h")
|
281
|
+
have_header("sys/cdefs.h")
|
282
|
+
have_func("dbm_pagfno((DBM *)0)", headers.found, headers.defs)
|
283
|
+
have_func("dbm_dirfno((DBM *)0)", headers.found, headers.defs)
|
284
|
+
convertible_int("datum.dsize", headers.found, headers.defs)
|
285
|
+
create_makefile("dbm/dbm")
|
286
|
+
end
|
data/lib/dbm.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "rubysl/dbm"
|
data/lib/rubysl/dbm.rb
ADDED
data/rubysl-dbm.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require './lib/rubysl/dbm/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "rubysl-dbm"
|
6
|
+
spec.version = RubySL::DBM::VERSION
|
7
|
+
spec.authors = ["Brian Shirai"]
|
8
|
+
spec.email = ["brixen@gmail.com"]
|
9
|
+
spec.description = %q{Ruby standard library dbm.}
|
10
|
+
spec.summary = %q{Ruby standard library dbm.}
|
11
|
+
spec.homepage = "https://github.com/rubysl/rubysl-dbm"
|
12
|
+
spec.license = "BSD"
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($/)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.extensions = ["ext/rubysl/dbm/extconf.rb"]
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ["lib"]
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "mspec", "~> 1.5"
|
23
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubysl-dbm
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brian Shirai
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-07 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.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
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: mspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.5'
|
55
|
+
description: Ruby standard library dbm.
|
56
|
+
email:
|
57
|
+
- brixen@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions:
|
60
|
+
- ext/rubysl/dbm/extconf.rb
|
61
|
+
extra_rdoc_files: []
|
62
|
+
files:
|
63
|
+
- .gitignore
|
64
|
+
- .travis.yml
|
65
|
+
- Gemfile
|
66
|
+
- LICENSE
|
67
|
+
- README.md
|
68
|
+
- Rakefile
|
69
|
+
- ext/rubysl/dbm/dbm.c
|
70
|
+
- ext/rubysl/dbm/extconf.rb
|
71
|
+
- lib/dbm.rb
|
72
|
+
- lib/rubysl/dbm.rb
|
73
|
+
- lib/rubysl/dbm/version.rb
|
74
|
+
- rubysl-dbm.gemspec
|
75
|
+
homepage: https://github.com/rubysl/rubysl-dbm
|
76
|
+
licenses:
|
77
|
+
- BSD
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 2.0.7
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Ruby standard library dbm.
|
99
|
+
test_files: []
|
100
|
+
has_rdoc:
|