bitclust-core 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +2907 -0
- data/Gemfile +7 -0
- data/README +21 -0
- data/Rakefile +20 -0
- data/bin/bitclust +14 -0
- data/bin/refe +36 -0
- data/bitclust-dev.gemspec +33 -0
- data/bitclust.gemspec +30 -0
- data/config.in +23 -0
- data/config.ru +48 -0
- data/config.ru.sample +31 -0
- data/data/bitclust/catalog/ja_JP.EUC-JP +78 -0
- data/data/bitclust/catalog/ja_JP.UTF-8 +78 -0
- data/data/bitclust/template.lillia/class +98 -0
- data/data/bitclust/template.lillia/class-index +28 -0
- data/data/bitclust/template.lillia/doc +48 -0
- data/data/bitclust/template.lillia/layout +19 -0
- data/data/bitclust/template.lillia/library +129 -0
- data/data/bitclust/template.lillia/library-index +32 -0
- data/data/bitclust/template.lillia/method +20 -0
- data/data/bitclust/template.lillia/rd_file +6 -0
- data/data/bitclust/template.offline/class +67 -0
- data/data/bitclust/template.offline/class-index +28 -0
- data/data/bitclust/template.offline/doc +13 -0
- data/data/bitclust/template.offline/function +22 -0
- data/data/bitclust/template.offline/function-index +24 -0
- data/data/bitclust/template.offline/layout +18 -0
- data/data/bitclust/template.offline/library +87 -0
- data/data/bitclust/template.offline/library-index +32 -0
- data/data/bitclust/template.offline/method +21 -0
- data/data/bitclust/template.offline/rd_file +6 -0
- data/data/bitclust/template/class +133 -0
- data/data/bitclust/template/class-index +30 -0
- data/data/bitclust/template/doc +14 -0
- data/data/bitclust/template/function +21 -0
- data/data/bitclust/template/function-index +25 -0
- data/data/bitclust/template/layout +19 -0
- data/data/bitclust/template/library +89 -0
- data/data/bitclust/template/library-index +35 -0
- data/data/bitclust/template/method +24 -0
- data/data/bitclust/template/opensearchdescription +10 -0
- data/data/bitclust/template/search +57 -0
- data/lib/bitclust.rb +9 -0
- data/lib/bitclust/app.rb +129 -0
- data/lib/bitclust/classentry.rb +425 -0
- data/lib/bitclust/compat.rb +39 -0
- data/lib/bitclust/completion.rb +531 -0
- data/lib/bitclust/crossrubyutils.rb +91 -0
- data/lib/bitclust/database.rb +181 -0
- data/lib/bitclust/docentry.rb +83 -0
- data/lib/bitclust/entry.rb +223 -0
- data/lib/bitclust/exception.rb +38 -0
- data/lib/bitclust/functiondatabase.rb +115 -0
- data/lib/bitclust/functionentry.rb +81 -0
- data/lib/bitclust/functionreferenceparser.rb +76 -0
- data/lib/bitclust/htmlutils.rb +80 -0
- data/lib/bitclust/interface.rb +87 -0
- data/lib/bitclust/libraryentry.rb +211 -0
- data/lib/bitclust/lineinput.rb +165 -0
- data/lib/bitclust/messagecatalog.rb +95 -0
- data/lib/bitclust/methoddatabase.rb +401 -0
- data/lib/bitclust/methodentry.rb +202 -0
- data/lib/bitclust/methodid.rb +209 -0
- data/lib/bitclust/methodsignature.rb +82 -0
- data/lib/bitclust/nameutils.rb +236 -0
- data/lib/bitclust/parseutils.rb +60 -0
- data/lib/bitclust/preprocessor.rb +273 -0
- data/lib/bitclust/rdcompiler.rb +507 -0
- data/lib/bitclust/refsdatabase.rb +66 -0
- data/lib/bitclust/requesthandler.rb +330 -0
- data/lib/bitclust/ridatabase.rb +349 -0
- data/lib/bitclust/rrdparser.rb +522 -0
- data/lib/bitclust/runner.rb +143 -0
- data/lib/bitclust/screen.rb +554 -0
- data/lib/bitclust/searcher.rb +518 -0
- data/lib/bitclust/server.rb +59 -0
- data/lib/bitclust/simplesearcher.rb +84 -0
- data/lib/bitclust/subcommand.rb +746 -0
- data/lib/bitclust/textutils.rb +51 -0
- data/lib/bitclust/version.rb +3 -0
- data/packer.rb +224 -0
- data/refe2.gemspec +29 -0
- data/server.exe +0 -0
- data/server.exy +159 -0
- data/server.rb +10 -0
- data/setup.rb +1596 -0
- data/standalone.rb +193 -0
- data/test/run_test.rb +15 -0
- data/test/test_bitclust.rb +81 -0
- data/test/test_entry.rb +39 -0
- data/test/test_functiondatabase.rb +55 -0
- data/test/test_libraryentry.rb +31 -0
- data/test/test_methoddatabase.rb +81 -0
- data/test/test_methodsignature.rb +14 -0
- data/test/test_nameutils.rb +324 -0
- data/test/test_preprocessor.rb +84 -0
- data/test/test_rdcompiler.rb +534 -0
- data/test/test_refsdatabase.rb +76 -0
- data/test/test_rrdparser.rb +26 -0
- data/test/test_runner.rb +102 -0
- data/test/test_simplesearcher.rb +48 -0
- data/theme/default/images/external.png +0 -0
- data/theme/default/rurema.png +0 -0
- data/theme/default/style.css +288 -0
- data/theme/default/test.css +254 -0
- data/theme/lillia/rurema.png +0 -0
- data/theme/lillia/style.css +331 -0
- data/theme/lillia/test.css +254 -0
- data/tools/bc-ancestors.rb +153 -0
- data/tools/bc-checkparams.rb +246 -0
- data/tools/bc-classes.rb +80 -0
- data/tools/bc-convert.rb +165 -0
- data/tools/bc-list.rb +63 -0
- data/tools/bc-methods.rb +171 -0
- data/tools/bc-preproc.rb +42 -0
- data/tools/bc-rdoc.rb +343 -0
- data/tools/bc-tochm.rb +301 -0
- data/tools/bc-tohtml.rb +125 -0
- data/tools/bc-tohtmlpackage.rb +241 -0
- data/tools/check-signature.rb +19 -0
- data/tools/forall-ruby.rb +20 -0
- data/tools/gencatalog.rb +69 -0
- data/tools/statrefm.rb +98 -0
- data/tools/stattodo.rb +150 -0
- data/tools/update-database.rb +146 -0
- data/view.cgi +6 -0
- metadata +222 -0
@@ -0,0 +1,211 @@
|
|
1
|
+
#
|
2
|
+
# bitclust/libraryentry.rb
|
3
|
+
#
|
4
|
+
# Copyright (c) 2006-2008 Minero Aoki
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute/modify this program under the Ruby License.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'bitclust/entry'
|
11
|
+
require 'bitclust/exception'
|
12
|
+
|
13
|
+
module BitClust
|
14
|
+
|
15
|
+
class LibraryEntry < Entry
|
16
|
+
|
17
|
+
include Enumerable
|
18
|
+
|
19
|
+
def LibraryEntry.type_id
|
20
|
+
:library
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(db, id)
|
24
|
+
super db
|
25
|
+
@id = id
|
26
|
+
if saved?
|
27
|
+
@classmap = nil
|
28
|
+
@methodmap = nil
|
29
|
+
@link_checked = true
|
30
|
+
else
|
31
|
+
@classmap = {}
|
32
|
+
@methodmap = {}
|
33
|
+
@link_checked = false
|
34
|
+
end
|
35
|
+
init_properties
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_reader :id
|
39
|
+
|
40
|
+
def ==(other)
|
41
|
+
@id == other.id
|
42
|
+
end
|
43
|
+
|
44
|
+
alias eql? ==
|
45
|
+
|
46
|
+
def hash
|
47
|
+
@id.hash
|
48
|
+
end
|
49
|
+
|
50
|
+
def <=>(other)
|
51
|
+
@id.casecmp(other.id)
|
52
|
+
end
|
53
|
+
|
54
|
+
def name
|
55
|
+
libid2name(@id)
|
56
|
+
end
|
57
|
+
alias label name
|
58
|
+
|
59
|
+
def labels
|
60
|
+
[label()]
|
61
|
+
end
|
62
|
+
|
63
|
+
def name?(n)
|
64
|
+
name() == n
|
65
|
+
end
|
66
|
+
|
67
|
+
persistent_properties {
|
68
|
+
property :requires, '[LibraryEntry]'
|
69
|
+
property :classes, '[ClassEntry]' # :defined classes
|
70
|
+
property :methods, '[MethodEntry]' # :added/:redefined entries
|
71
|
+
property :source, 'String'
|
72
|
+
property :sublibraries, '[LibraryEntry]'
|
73
|
+
property :is_sublibrary, 'bool'
|
74
|
+
}
|
75
|
+
|
76
|
+
def inspect
|
77
|
+
"#<library #{@id}>"
|
78
|
+
end
|
79
|
+
|
80
|
+
def check_link(path = [])
|
81
|
+
return if @link_checked
|
82
|
+
if path.include?(name())
|
83
|
+
raise InvalidLink, "looped require: #{path_string(path)}"
|
84
|
+
end
|
85
|
+
path.push name()
|
86
|
+
requires().each do |lib|
|
87
|
+
lib.check_link path
|
88
|
+
end
|
89
|
+
path.pop
|
90
|
+
@link_checked = true
|
91
|
+
end
|
92
|
+
|
93
|
+
def all_requires(libs = {})
|
94
|
+
requires.each{|l|
|
95
|
+
next if libs[l.name]
|
96
|
+
libs[l.name] = l
|
97
|
+
l.all_requires(libs)
|
98
|
+
}
|
99
|
+
libs.values
|
100
|
+
end
|
101
|
+
|
102
|
+
def all_classes
|
103
|
+
return @all_classes if @all_classes
|
104
|
+
required_classes = (sublibraries & requires).map{|l| l.classes }.flatten
|
105
|
+
@all_classes = (classes() + required_classes).uniq.sort
|
106
|
+
end
|
107
|
+
|
108
|
+
def error_classes
|
109
|
+
@error_classes ||= classes.select{|c| c.ancestors.any?{|k| k.name == 'Exception' }}
|
110
|
+
end
|
111
|
+
|
112
|
+
def all_error_classes
|
113
|
+
@all_error_classes ||= all_classes.select{|c| c.ancestors.any?{|k| k.name == 'Exception' }}
|
114
|
+
end
|
115
|
+
|
116
|
+
def require(lib)
|
117
|
+
requires().push lib
|
118
|
+
end
|
119
|
+
|
120
|
+
def sublibrary(lib)
|
121
|
+
unless sublibraries().include?(lib)
|
122
|
+
sublibraries().push lib
|
123
|
+
lib.is_sublibrary = true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def fetch_class(name)
|
128
|
+
get_class(name) or
|
129
|
+
raise ClassNotFound, "no such class in the library #{name()}: #{name}"
|
130
|
+
end
|
131
|
+
|
132
|
+
def get_class(name)
|
133
|
+
classes().detect {|c| c.name == name }
|
134
|
+
end
|
135
|
+
|
136
|
+
def classnames
|
137
|
+
classes().map {|c| c.name }
|
138
|
+
end
|
139
|
+
|
140
|
+
def each_class(&block)
|
141
|
+
classes().each(&block)
|
142
|
+
end
|
143
|
+
|
144
|
+
def classmap
|
145
|
+
@classmap ||=
|
146
|
+
begin
|
147
|
+
h = {}
|
148
|
+
classes().each do |c|
|
149
|
+
h[c.name] = c
|
150
|
+
end
|
151
|
+
h
|
152
|
+
end
|
153
|
+
end
|
154
|
+
private :classmap
|
155
|
+
|
156
|
+
def fetch_methods(spec)
|
157
|
+
ms = if c = get_class(spec.klass)
|
158
|
+
then c.fetch_methods(spec)
|
159
|
+
else []
|
160
|
+
end +
|
161
|
+
methods().select {|m| spec.match?(m) }
|
162
|
+
if ms.empty?
|
163
|
+
raise MethodNotFound, "no such method in the library #{name()}: #{name}"
|
164
|
+
end
|
165
|
+
ms
|
166
|
+
end
|
167
|
+
|
168
|
+
def fetch_method(spec)
|
169
|
+
classes().each do |c|
|
170
|
+
m = c.get_method(spec)
|
171
|
+
return m if m
|
172
|
+
end
|
173
|
+
methods().detect {|m| spec.match?(m) } or
|
174
|
+
raise MethodNotFound, "no such method in the library #{name()}: #{name}"
|
175
|
+
end
|
176
|
+
|
177
|
+
def each_method(&block)
|
178
|
+
methods().each(&block)
|
179
|
+
end
|
180
|
+
|
181
|
+
def methodmap
|
182
|
+
@methodmap ||=
|
183
|
+
begin
|
184
|
+
h = {}
|
185
|
+
methods().each do |m|
|
186
|
+
h[m] = m
|
187
|
+
end
|
188
|
+
h
|
189
|
+
end
|
190
|
+
end
|
191
|
+
private :methodmap
|
192
|
+
|
193
|
+
def add_class(c)
|
194
|
+
unless classmap()[c.name]
|
195
|
+
classes().push c
|
196
|
+
classmap()[c.name] = c
|
197
|
+
@db.dirty_library self
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def add_method(m)
|
202
|
+
unless methodmap()[m]
|
203
|
+
methods().push m
|
204
|
+
methodmap()[m] = m
|
205
|
+
@db.dirty_library self
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
#
|
2
|
+
# $Id: lineinput.rb 3723 2007-03-28 21:34:13Z aamine $
|
3
|
+
#
|
4
|
+
# Copyright (c) 2002-2007 Minero Aoki
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute/modify this program under the terms of
|
8
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'stringio'
|
12
|
+
|
13
|
+
class LineInput
|
14
|
+
|
15
|
+
def LineInput.for_string(s)
|
16
|
+
new(StringIO.new(s))
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(f)
|
20
|
+
@input = f
|
21
|
+
@buf = []
|
22
|
+
@lineno = 0
|
23
|
+
@eof_p = false
|
24
|
+
end
|
25
|
+
|
26
|
+
def inspect
|
27
|
+
"\#<#{self.class} file=#{@input.inspect} line=#{lineno()}>"
|
28
|
+
end
|
29
|
+
|
30
|
+
def eof?
|
31
|
+
@eof_p
|
32
|
+
end
|
33
|
+
|
34
|
+
def path
|
35
|
+
@input.path
|
36
|
+
end
|
37
|
+
|
38
|
+
def lineno
|
39
|
+
@lineno
|
40
|
+
end
|
41
|
+
|
42
|
+
def gets
|
43
|
+
unless @buf.empty?
|
44
|
+
@lineno += 1
|
45
|
+
return @buf.pop
|
46
|
+
end
|
47
|
+
return nil if @eof_p # to avoid ARGF blocking.
|
48
|
+
line = @input.gets
|
49
|
+
@eof_p = true unless line
|
50
|
+
@lineno += 1
|
51
|
+
line
|
52
|
+
end
|
53
|
+
|
54
|
+
def ungets(line)
|
55
|
+
return unless line
|
56
|
+
@lineno -= 1
|
57
|
+
@buf.push line
|
58
|
+
line
|
59
|
+
end
|
60
|
+
|
61
|
+
def peek
|
62
|
+
line = gets()
|
63
|
+
ungets line if line
|
64
|
+
line
|
65
|
+
end
|
66
|
+
|
67
|
+
def next?
|
68
|
+
peek() ? true : false
|
69
|
+
end
|
70
|
+
|
71
|
+
def skip_blank_lines
|
72
|
+
n = 0
|
73
|
+
while line = gets()
|
74
|
+
unless line.strip.empty?
|
75
|
+
ungets line
|
76
|
+
return n
|
77
|
+
end
|
78
|
+
n += 1
|
79
|
+
end
|
80
|
+
n
|
81
|
+
end
|
82
|
+
|
83
|
+
def gets_if(re)
|
84
|
+
line = gets()
|
85
|
+
if not line or not (re =~ line)
|
86
|
+
ungets line
|
87
|
+
return nil
|
88
|
+
end
|
89
|
+
line
|
90
|
+
end
|
91
|
+
|
92
|
+
def gets_unless(re)
|
93
|
+
line = gets()
|
94
|
+
if not line or re =~ line
|
95
|
+
ungets line
|
96
|
+
return nil
|
97
|
+
end
|
98
|
+
line
|
99
|
+
end
|
100
|
+
|
101
|
+
def each
|
102
|
+
while line = gets()
|
103
|
+
yield line
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def while_match(re)
|
108
|
+
while line = gets()
|
109
|
+
unless re =~ line
|
110
|
+
ungets line
|
111
|
+
return
|
112
|
+
end
|
113
|
+
yield line
|
114
|
+
end
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
|
118
|
+
def getlines_while(re)
|
119
|
+
buf = []
|
120
|
+
while_match(re) do |line|
|
121
|
+
buf.push line
|
122
|
+
end
|
123
|
+
buf
|
124
|
+
end
|
125
|
+
|
126
|
+
alias span getlines_while # from Haskell
|
127
|
+
|
128
|
+
def until_match(re)
|
129
|
+
while line = gets()
|
130
|
+
if re =~ line
|
131
|
+
ungets line
|
132
|
+
return
|
133
|
+
end
|
134
|
+
yield line
|
135
|
+
end
|
136
|
+
nil
|
137
|
+
end
|
138
|
+
|
139
|
+
def getlines_until(re)
|
140
|
+
buf = []
|
141
|
+
until_match(re) do |line|
|
142
|
+
buf.push line
|
143
|
+
end
|
144
|
+
buf
|
145
|
+
end
|
146
|
+
|
147
|
+
alias break getlines_until # from Haskell
|
148
|
+
|
149
|
+
def until_terminator(re)
|
150
|
+
while line = gets()
|
151
|
+
return if re =~ line # discard terminal line
|
152
|
+
yield line
|
153
|
+
end
|
154
|
+
nil
|
155
|
+
end
|
156
|
+
|
157
|
+
def getblock(term_re)
|
158
|
+
buf = []
|
159
|
+
until_terminator(term_re) do |line|
|
160
|
+
buf.push line
|
161
|
+
end
|
162
|
+
buf
|
163
|
+
end
|
164
|
+
|
165
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#
|
2
|
+
# bitclust/messagecatalog.rb
|
3
|
+
#
|
4
|
+
# Copyright (c) 2006-2008 Minero Aoki
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute/modify this program under the Ruby License.
|
8
|
+
#
|
9
|
+
|
10
|
+
module BitClust
|
11
|
+
|
12
|
+
module Translatable
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def init_message_catalog(catalog)
|
17
|
+
@__message_catalog = catalog
|
18
|
+
end
|
19
|
+
|
20
|
+
def message_catalog
|
21
|
+
@__message_catalog
|
22
|
+
end
|
23
|
+
|
24
|
+
def _(key, *args)
|
25
|
+
@__message_catalog.translate(key, *args)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
# FIXME: support automatic encoding-conversion
|
31
|
+
class MessageCatalog
|
32
|
+
|
33
|
+
ENCODING_MAP = {
|
34
|
+
'utf-8' => 'UTF-8',
|
35
|
+
'euc-jp' => 'EUC-JP',
|
36
|
+
'shift_jis' => 'Shift_JIS'
|
37
|
+
}
|
38
|
+
|
39
|
+
# FIXME: support non ja_JP locales
|
40
|
+
def MessageCatalog.encoding2locale(enc)
|
41
|
+
newenc = ENCODING_MAP[enc.downcase]
|
42
|
+
newenc ? "ja_JP.#{newenc}" : "C"
|
43
|
+
end
|
44
|
+
|
45
|
+
def MessageCatalog.load(prefix)
|
46
|
+
load_with_locales(prefix, env_locales())
|
47
|
+
end
|
48
|
+
|
49
|
+
def MessageCatalog.load_with_locales(prefix, locales)
|
50
|
+
path, loc = find_catalog(prefix, locales)
|
51
|
+
path ? load_file(path, loc) : new({}, 'C')
|
52
|
+
end
|
53
|
+
|
54
|
+
def MessageCatalog.env_locales
|
55
|
+
[ENV['LC_MESSAGES'], ENV['LC_ALL'], ENV['LANG'], 'C']\
|
56
|
+
.compact.uniq.reject {|loc| loc.empty? }
|
57
|
+
end
|
58
|
+
private_class_method :env_locales
|
59
|
+
|
60
|
+
def MessageCatalog.find_catalog(prefix, locales)
|
61
|
+
locales.each do |locale|
|
62
|
+
path = "#{prefix}/#{locale}"
|
63
|
+
return path, locale if File.file?(path)
|
64
|
+
end
|
65
|
+
nil
|
66
|
+
end
|
67
|
+
private_class_method :find_catalog
|
68
|
+
|
69
|
+
def MessageCatalog.load_file(path, locale)
|
70
|
+
h = {}
|
71
|
+
fopen(path, 'r:UTF-8') {|f|
|
72
|
+
f.each do |key|
|
73
|
+
h[key.chomp] = f.gets.chomp
|
74
|
+
end
|
75
|
+
}
|
76
|
+
new(h, locale)
|
77
|
+
end
|
78
|
+
|
79
|
+
def initialize(msgs, locale)
|
80
|
+
@msgs = msgs
|
81
|
+
@locale = locale
|
82
|
+
end
|
83
|
+
|
84
|
+
def inspect
|
85
|
+
"\#<#{self.class} #{@locale}>"
|
86
|
+
end
|
87
|
+
|
88
|
+
def translate(key, *args)
|
89
|
+
str = @msgs[key] || key
|
90
|
+
sprintf(str, *args)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|