rwdaddresses 0.8

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.
Files changed (166) hide show
  1. data/Readme.txt +57 -0
  2. data/bin/rwdaddresses +19 -0
  3. data/code/ag1core/aa0begin.rb +18 -0
  4. data/code/ag1core/rwdtinkerversion.rb +15 -0
  5. data/code/al5languagefiles/alanguagehashbegin.rb +4 -0
  6. data/code/al5languagefiles/languagehash.rb +4 -0
  7. data/code/al5languagefiles/templangfile.rb +6 -0
  8. data/code/al5languagefiles/zlanguagehashend.rb +6 -0
  9. data/code/gl3addresses/gl3viewnamedata.rb +26 -0
  10. data/code/gl3addresses/gl4listnamerecord.rb +11 -0
  11. data/code/gl3addresses/gl4viewphoto.rb +4 -0
  12. data/code/gl3addresses/gl5createnewnamerecord.rb +17 -0
  13. data/code/lm1installapplets/ll5listzips.rb +14 -0
  14. data/code/lm1installapplets/lm1installapplet.rb +20 -0
  15. data/code/ssdiagnostictab/diagnostictab.rb +20 -0
  16. data/code/xa5rwdtinkercallable/callable.rb +13 -0
  17. data/code/xb1rwdtinkerbackwindow/05listinstalledfiles.rb +11 -0
  18. data/code/xb1rwdtinkerbackwindow/diagnostictab.rb +20 -0
  19. data/code/xb1rwdtinkerbackwindow/ll1openname.rb +18 -0
  20. data/code/xb1rwdtinkerbackwindow/ll5listzips.rb +14 -0
  21. data/code/xb1rwdtinkerbackwindow/lm1installapplet.rb +20 -0
  22. data/code/xb1rwdtinkerbackwindow/mm1removeapplet.rb +28 -0
  23. data/code/xb1rwdtinkerbackwindow/rwdtinkerwin2version.rb +14 -0
  24. data/code/zz0applicationend/zz0end.rb +4 -0
  25. data/configuration/aa0rwdframework.cnf +11 -0
  26. data/configuration/ab1tinkerwin2.cnf +3 -0
  27. data/configuration/gl3addresses.cnf +2 -0
  28. data/ev/browser.rb +109 -0
  29. data/ev/ftools.rb +170 -0
  30. data/ev/net.rb +750 -0
  31. data/ev/ruby.rb +819 -0
  32. data/ev/rwd.rb +1848 -0
  33. data/ev/sgml.rb +236 -0
  34. data/ev/thread.rb +63 -0
  35. data/ev/tree.rb +343 -0
  36. data/ev/xml.rb +4 -0
  37. data/gui/en/aa2core/aa0rwdtop.rwd +3 -0
  38. data/gui/en/gl3addresses/gl3viewnamedata.rwd +16 -0
  39. data/gui/en/gl3addresses/gl4listnamerecordfiles.rwd +17 -0
  40. data/gui/en/gl3addresses/gl5createnewnamerecord.rwd +26 -0
  41. data/gui/en/ll1selectiontabbegin/selectiontabbegin.rwd +15 -0
  42. data/gui/en/ll5rwdtinkerwin2selectiontab/rwdwin2selectiontab.rwd +11 -0
  43. data/gui/en/lz1selectiontabend/endselectiontab.rwd +1 -0
  44. data/gui/en/tt0documentsbegin/tt0documentbegin.rwd +5 -0
  45. data/gui/en/uu5rwddocuments/uu5documents.rwd +13 -0
  46. data/gui/en/uu6rwdtinkerwin2documents/uu5documents.rwd +4 -0
  47. data/gui/en/uu8addresses/uu8doc_rwdschedule.rwd +4 -0
  48. data/gui/en/ww0documentsend/ww0documentend.rwd +6 -0
  49. data/gui/en/wz6finaltabs/xx0rwdfirsttab.rwd +4 -0
  50. data/gui/en/xa1versionwindow/1appname.rwd +17 -0
  51. data/gui/en/xa5rwdtinkercallablewindow/1appname.rwd +15 -0
  52. data/gui/en/xa5rwdtinkercallablewindow/9end.rwd +4 -0
  53. data/gui/en/xb1rwdtinkerbackwindow/1appname.rwd +3 -0
  54. data/gui/en/xb1rwdtinkerbackwindow/2tab1.rwd +9 -0
  55. data/gui/en/xb1rwdtinkerbackwindow/3arwddiagnostics.rwd +31 -0
  56. data/gui/en/xb1rwdtinkerbackwindow/4arwdlistapplets.rwd +42 -0
  57. data/gui/en/xb1rwdtinkerbackwindow/4arwdlistzips.rwd +33 -0
  58. data/gui/en/xb1rwdtinkerbackwindow/9backend.rwd +5 -0
  59. data/gui/en/ya1helpaboutbegin/ya0helpscreenstart.rwd +1 -0
  60. data/gui/en/yg5rwdhelpabout/1appname.rwd +2 -0
  61. data/gui/en/yg5rwdhelpabout/3copyright.rwd +1 -0
  62. data/gui/en/yg5rwdhelpabout/5version.rwd +9 -0
  63. data/gui/en/yg6rwdwin2helpabout/1appname.rwd +2 -0
  64. data/gui/en/yg6rwdwin2helpabout/3copyright.rwd +1 -0
  65. data/gui/en/yg6rwdwin2helpabout/5version.rwd +9 -0
  66. data/gui/en/yl3addresseshelp/yl3helpscreen.rwd +4 -0
  67. data/gui/en/yy7addressesphotowindow/yy7addressesphoto.rwd +3 -0
  68. data/gui/en/za1applicationend/yy9rwdend.rwd +2 -0
  69. data/gui/es/aa2core/aa0rwdtop.rwd +3 -0
  70. data/gui/es/gl3addresses/gl3viewnamedata.rwd +16 -0
  71. data/gui/es/gl3addresses/gl4listnamerecordfiles.rwd +17 -0
  72. data/gui/es/gl3addresses/gl5createnewnamerecord.rwd +26 -0
  73. data/gui/es/ll1selectiontabbegin/selectiontabbegin.rwd +15 -0
  74. data/gui/es/ll5rwdtinkerwin2selectiontab/rwdwin2selectiontab.rwd +11 -0
  75. data/gui/es/lz1selectiontabend/endselectiontab.rwd +1 -0
  76. data/gui/es/tt0documentsbegin/tt0documentbegin.rwd +5 -0
  77. data/gui/es/uu5rwddocuments/uu5documents.rwd +13 -0
  78. data/gui/es/uu6rwdtinkerwin2documents/uu5documents.rwd +4 -0
  79. data/gui/es/uu8addresses/uu8doc_rwdschedule.rwd +4 -0
  80. data/gui/es/ww0documentsend/ww0documentend.rwd +6 -0
  81. data/gui/es/wz6finaltabs/xx0rwdfirsttab.rwd +4 -0
  82. data/gui/es/xa1versionwindow/1appname.rwd +17 -0
  83. data/gui/es/xa5rwdtinkercallablewindow/1appname.rwd +15 -0
  84. data/gui/es/xa5rwdtinkercallablewindow/9end.rwd +4 -0
  85. data/gui/es/xb1rwdtinkerbackwindow/1appname.rwd +3 -0
  86. data/gui/es/xb1rwdtinkerbackwindow/2tab1.rwd +9 -0
  87. data/gui/es/xb1rwdtinkerbackwindow/3arwddiagnostics.rwd +31 -0
  88. data/gui/es/xb1rwdtinkerbackwindow/4arwdlistapplets.rwd +42 -0
  89. data/gui/es/xb1rwdtinkerbackwindow/4arwdlistzips.rwd +33 -0
  90. data/gui/es/xb1rwdtinkerbackwindow/9backend.rwd +5 -0
  91. data/gui/es/ya1helpaboutbegin/ya0helpscreenstart.rwd +1 -0
  92. data/gui/es/yg5rwdhelpabout/1appname.rwd +2 -0
  93. data/gui/es/yg5rwdhelpabout/3copyright.rwd +1 -0
  94. data/gui/es/yg5rwdhelpabout/5version.rwd +9 -0
  95. data/gui/es/yg6rwdwin2helpabout/1appname.rwd +2 -0
  96. data/gui/es/yg6rwdwin2helpabout/3copyright.rwd +1 -0
  97. data/gui/es/yg6rwdwin2helpabout/5version.rwd +9 -0
  98. data/gui/es/yl3addresseshelp/yl3helpscreen.rwd +4 -0
  99. data/gui/es/yy7addressesphotowindow/yy7addressesphoto.rwd +3 -0
  100. data/gui/es/za1applicationend/yy9rwdend.rwd +2 -0
  101. data/gui/nl/aa2core/aa0rwdtop.rwd +3 -0
  102. data/gui/nl/gl3addresses/gl3viewnamedata.rwd +16 -0
  103. data/gui/nl/gl3addresses/gl4listnamerecordfiles.rwd +17 -0
  104. data/gui/nl/gl3addresses/gl5createnewnamerecord.rwd +26 -0
  105. data/gui/nl/ll1selectiontabbegin/selectiontabbegin.rwd +15 -0
  106. data/gui/nl/ll5rwdtinkerwin2selectiontab/rwdwin2selectiontab.rwd +11 -0
  107. data/gui/nl/lz1selectiontabend/endselectiontab.rwd +1 -0
  108. data/gui/nl/tt0documentsbegin/tt0documentbegin.rwd +5 -0
  109. data/gui/nl/uu5rwddocuments/uu5documents.rwd +13 -0
  110. data/gui/nl/uu6rwdtinkerwin2documents/uu5documents.rwd +4 -0
  111. data/gui/nl/uu8addresses/uu8doc_rwdschedule.rwd +4 -0
  112. data/gui/nl/ww0documentsend/ww0documentend.rwd +6 -0
  113. data/gui/nl/wz6finaltabs/xx0rwdfirsttab.rwd +4 -0
  114. data/gui/nl/xa1versionwindow/1appname.rwd +17 -0
  115. data/gui/nl/xa5rwdtinkercallablewindow/1appname.rwd +15 -0
  116. data/gui/nl/xa5rwdtinkercallablewindow/9end.rwd +4 -0
  117. data/gui/nl/xb1rwdtinkerbackwindow/1appname.rwd +3 -0
  118. data/gui/nl/xb1rwdtinkerbackwindow/2tab1.rwd +9 -0
  119. data/gui/nl/xb1rwdtinkerbackwindow/3arwddiagnostics.rwd +31 -0
  120. data/gui/nl/xb1rwdtinkerbackwindow/4arwdlistapplets.rwd +42 -0
  121. data/gui/nl/xb1rwdtinkerbackwindow/4arwdlistzips.rwd +33 -0
  122. data/gui/nl/xb1rwdtinkerbackwindow/9backend.rwd +5 -0
  123. data/gui/nl/ya1helpaboutbegin/ya0helpscreenstart.rwd +1 -0
  124. data/gui/nl/yg5rwdhelpabout/1appname.rwd +2 -0
  125. data/gui/nl/yg5rwdhelpabout/3copyright.rwd +1 -0
  126. data/gui/nl/yg5rwdhelpabout/5version.rwd +9 -0
  127. data/gui/nl/yg6rwdwin2helpabout/1appname.rwd +2 -0
  128. data/gui/nl/yg6rwdwin2helpabout/3copyright.rwd +1 -0
  129. data/gui/nl/yg6rwdwin2helpabout/5version.rwd +9 -0
  130. data/gui/nl/yl3addresseshelp/yl3helpscreen.rwd +4 -0
  131. data/gui/nl/yy7addressesphotowindow/yy7addressesphoto.rwd +3 -0
  132. data/gui/nl/za1applicationend/yy9rwdend.rwd +2 -0
  133. data/init.rb +164 -0
  134. data/installed/addressessample1.inf +5 -0
  135. data/installed/rwdaddresses-0.8.inf +11 -0
  136. data/installed/rwdtinkerwin2-0.5.inf +16 -0
  137. data/lang/en/rwdcore/languagefile.rb +6 -0
  138. data/lang/es/rwdcore/languagefile.rb +4 -0
  139. data/lang/nl/rwdcore/languagefile.rb +4 -0
  140. data/lib/temp.rb +1 -0
  141. data/names/AngelinaJolie.nam +8 -0
  142. data/names/AngelinaJolie.png +0 -0
  143. data/names/StevenGibson.nam +5 -0
  144. data/names/StevenGibson.png +0 -0
  145. data/names/nophoto.png +0 -0
  146. data/rwd_files/HowTo_Addresses.html +163 -0
  147. data/rwd_files/HowTo_Addresses.txt +145 -0
  148. data/rwd_files/HowTo_Tinker.html +370 -0
  149. data/rwd_files/HowTo_Tinker.txt +244 -0
  150. data/rwd_files/HowTo_TinkerWin2.txt +202 -0
  151. data/rwd_files/Readme.txt +57 -0
  152. data/rwd_files/contacttmp.png +0 -0
  153. data/rwd_files/favicon.ico +0 -0
  154. data/rwd_files/rdoc-style.css +175 -0
  155. data/rwd_files/rwdapplications.html +54 -0
  156. data/rwd_files/rwdindex.html +6 -0
  157. data/tests/rubyslippers-0.92.gemspec +17 -0
  158. data/tests/rwdtinker-1.2.gemspec +17 -0
  159. data/tests/rwdtinkertestEN.rb +87 -0
  160. data/tests/temptest.out +18 -0
  161. data/tests/totranslate.lang +93 -0
  162. data/zips/rwdaviewphoto-0.3.zip +0 -0
  163. data/zips/rwdhelloworld-0.2.zip +0 -0
  164. data/zips/rwdrefreshacpi-0.1.zip +0 -0
  165. data/zips/rwdwtinkerwin2-0.5.zip +0 -0
  166. metadata +206 -0
data/ev/ruby.rb ADDED
@@ -0,0 +1,819 @@
1
+ require "cgi"
2
+ require "rbconfig"
3
+ require "thread"
4
+
5
+ Thread.abort_on_exception = true
6
+
7
+ $DEBUG = ($DEBUG or ENV["RUBYDEBUG"] or false)
8
+
9
+ #tekens = '\w\~\@\#\$\%\^\&\*\-\+'
10
+ tekens = '^\s\r\n\`\!\(\)\[\]\{\}\<\>\,\.\/\?\\\|\=\;\:\"'
11
+
12
+ #tekens11 = '\w'
13
+ tekens11 = tekens + "'"
14
+
15
+ tekens21 = tekens + "'"
16
+ tekens22 = tekens
17
+ tekens23 = tekens + "'"
18
+
19
+ tekens31 = '\w\s\r\n'
20
+
21
+ RegExpStringWord = "([#{tekens11}]+)" ; RegExpWord = Regexp.new(RegExpStringWord)
22
+ RegExpStringWord2 = "([#{tekens21}]([#{tekens22}]*[#{tekens23}])?)" ; RegExpWord2 = Regexp.new(RegExpStringWord2)
23
+ RegExpStringText = "([#{tekens31}]+)" ; RegExpText = Regexp.new(RegExpStringText)
24
+ RegExpStringFile = '(\w[\w\.\-]*)' ; RegExpFile = Regexp.new(RegExpStringFile)
25
+ RegExpStringEmail = '([\w\-\.]+@[\w\-\.]+)' ; RegExpEmail = Regexp.new(RegExpStringEmail)
26
+ RegExpStringURL = '(\w+:\/\/[\w\.\-]+(:\d*)?\/[\w\.\-\/\#\?\=\%]*)' ; RegExpURL = Regexp.new(RegExpStringURL)
27
+ RegExpStringPrint = '([\w \t\r\n\`\~\!\@\#\$\%\^\&\*\(\)\-\+\=\[\]\{\}\;\:\'\"\,\.\/\<\>\?\\\|]+)' ; RegExpPrint = Regexp.new(RegExpStringPrint)
28
+ RegExpStringDiff = '(^[\-\+]([^\-\+].*)?)' ; RegExpDiff = Regexp.new(RegExpStringDiff)
29
+
30
+ module Enumerable
31
+ def deep_dup
32
+ Marshal::load(Marshal::dump(dup))
33
+ end
34
+
35
+ def deep_clone
36
+ Marshal::load(Marshal::dump(clone))
37
+ end
38
+ end
39
+
40
+ class Thread
41
+ def self.background(*args)
42
+ new(*args) do |*args|
43
+ Thread.pass
44
+
45
+ yield(*args)
46
+ end
47
+ end
48
+ end
49
+
50
+ class Object
51
+ alias deep_dup :dup
52
+ alias deep_clone :clone
53
+
54
+ def to_fs
55
+ to_s
56
+ end
57
+
58
+ def ids
59
+ id
60
+ end
61
+ end
62
+
63
+ class Numeric
64
+ def to_fs
65
+ to_f
66
+ end
67
+ end
68
+
69
+ class Integer
70
+ def oct
71
+ n = self
72
+ res = []
73
+
74
+ while n > 8
75
+ n, x = n.divmod(8)
76
+ res << x
77
+ end
78
+ res << n
79
+
80
+ res.reverse.join("")
81
+ end
82
+ end
83
+
84
+ class String
85
+ def chomp!(dummy=nil)
86
+ self.gsub!(/[\r\n]*\z/, "")
87
+ end
88
+
89
+ def chomp(dummy=nil)
90
+ self.gsub(/[\r\n]*\z/, "")
91
+ end
92
+
93
+ def lf
94
+ self.gsub(/\r*\n/, "\n").gsub(/\n\z/, "") + "\n"
95
+ end
96
+
97
+ def crlf
98
+ self.gsub(/\r*\n/, "\r\n").gsub(/\r\n\z/, "") + "\r\n"
99
+ end
100
+
101
+ def strip
102
+ self.stripbefore.stripafter
103
+ end
104
+
105
+ def stripbefore
106
+ self.gsub(/\A[[:blank:]\r\n]*/, "")
107
+ end
108
+
109
+ def stripafter
110
+ self.gsub(/[[:blank:]\r\n]*\z/, "")
111
+ end
112
+
113
+ def compress
114
+ self.gsub(/[[:blank:]\r\n]+/, " ").strip
115
+ end
116
+
117
+ def compressspaces
118
+ self.gsub(/[[:blank:]]+/, " ")
119
+ end
120
+
121
+ def compressperline
122
+ res = self.split(/\n/)
123
+ res.collect!{|line| line.compress}
124
+ res.delete_if{|line| line.empty?}
125
+ res.join("\n")
126
+ end
127
+
128
+ def numeric?
129
+ d, a, n = [self].to_par
130
+
131
+ not n.empty?
132
+ end
133
+
134
+ def exec(input=nil, output=true)
135
+ res = []
136
+
137
+ IO.popen(self, "w+") do |f|
138
+ f.puts input unless input.nil?
139
+ f.close_write
140
+
141
+ res = f.readlines if output
142
+ end
143
+
144
+ res.join("")
145
+ end
146
+
147
+ def eval
148
+ Kernel::eval(self)
149
+ end
150
+
151
+ def speak
152
+ require "drb"
153
+
154
+ DRb.start_service
155
+ DRbObject.new(nil, "druby://localhost:3100").speak(self)
156
+ end
157
+
158
+ def splitblocks(*delimiters)
159
+ begindelimiters = []
160
+ enddelimiters = []
161
+
162
+ delimiters.each do |k, v|
163
+ begindelimiters << k.downcase
164
+ enddelimiters << v.downcase
165
+ end
166
+
167
+ bd = begindelimiters.collect {|s| Regexp.escape(s)}
168
+ ed = enddelimiters.collect {|s| Regexp.escape(s)}
169
+
170
+ be = bd.join("|")
171
+ ee = ed.join("|")
172
+
173
+ res = []
174
+ type = 0
175
+ tmp = ""
176
+ bs = ""
177
+ es = ""
178
+
179
+ self.split(/(#{ee}|#{be})/i).each do |s|
180
+ if type == 0
181
+ if begindelimiters.include?(s.downcase)
182
+ i = begindelimiters.index(s.downcase)
183
+ type = i+1
184
+ tmp = s
185
+ bs = s.downcase
186
+ es = enddelimiters[i]
187
+ else
188
+ res << [0, s] unless s.empty?
189
+ end
190
+ else
191
+ if s.downcase == es
192
+ res << [type, tmp + s]
193
+ type = 0
194
+ tmp = ""
195
+ bs = ""
196
+ es = ""
197
+ else
198
+ if s.downcase == bs
199
+ res << [0, tmp]
200
+ tmp = s
201
+ else
202
+ tmp = tmp + s
203
+ end
204
+ end
205
+ end
206
+ end
207
+
208
+ res << [0, tmp] unless tmp.empty?
209
+
210
+ return res
211
+ end
212
+
213
+ def splitwords(tokens=[])
214
+ tokens = [tokens] unless tokens.kind_of?(Array)
215
+ res = []
216
+
217
+ self.splitblocks(["'", "'"], ['"', '"']).each do |type, s|
218
+ case type
219
+ when 0
220
+ tokens.each do |token|
221
+ token2 = token
222
+ token2 = Regexp.escape(token2) if token2.kind_of?(String)
223
+ s.gsub!(/#{token2}/, " #{token} ")
224
+ end
225
+ s.split().each do |w|
226
+ res << w
227
+ end
228
+ when 1, 2
229
+ res << s[1..-2]
230
+ end
231
+ end
232
+
233
+ return res
234
+ end
235
+
236
+ def uncomment
237
+ res = []
238
+
239
+ self.splitblocks(["'", "'"], ['"', '"'], ["#", "\n"]).each do |type, s|
240
+ case type
241
+ when 0, 1, 2 then res << s
242
+ when 3 then res << "\n"
243
+ end
244
+ end
245
+
246
+ res.join("")
247
+ end
248
+
249
+ def noquotes
250
+ self.sub(/\A['"]/, "").sub(/['"]\z/, "")
251
+ end
252
+
253
+ def to_html(eolconversion=true)
254
+ s = CGI.escapeHTML(self)
255
+
256
+ s.gsub!(/\"/, "\&#34;")
257
+ s.gsub!(/\'/, "\&#180;")
258
+
259
+ if eolconversion
260
+ s.gsub!(/\n/ , "<br>")
261
+ end
262
+
263
+ s
264
+ end
265
+
266
+ def from_html(eolconversion=true)
267
+ s = self
268
+
269
+ s.gsub!(/&#34;/ , "\"")
270
+ s.gsub!(/&#180;/, "\'")
271
+
272
+ s = CGI.unescapeHTML(self)
273
+
274
+ if eolconversion
275
+ s.gsub!(/<br>/, "\n")
276
+ end
277
+
278
+ s
279
+ end
280
+
281
+ def to_fs
282
+ if numeric?
283
+ to_f
284
+ else
285
+ to_s
286
+ end
287
+ end
288
+ end
289
+
290
+ class Array
291
+ def chomp!
292
+ self.collect!{|s| s.chomp}
293
+ end
294
+
295
+ def chomp
296
+ self.collect{|s| s.chomp}
297
+ end
298
+
299
+ def compress
300
+ self.collect{|s| s.compress}
301
+ end
302
+
303
+ def uncomment
304
+ self.join("\0").uncomment.split("\0")
305
+ end
306
+
307
+ def strip
308
+ self.collect{|s| s.strip}
309
+ end
310
+
311
+ def sum
312
+ res = 0
313
+ self.each do |n|
314
+ res += n
315
+ end
316
+ res
317
+ end
318
+
319
+ def product
320
+ res = 1
321
+ self.each do |n|
322
+ res *= n
323
+ end
324
+ res
325
+ end
326
+
327
+ def joinwords(sep=" ", quote='"')
328
+ self.collect do |s|
329
+ s = quote + s + quote if s =~ /[[:blank:]]/
330
+ s
331
+ end.join(sep)
332
+ end
333
+
334
+ def domino(tabellen, kolom=nil, onlymatchinglines=false)
335
+ links = self
336
+ res = []
337
+ res = self.dup unless onlymatchinglines
338
+
339
+ tabellen.each do |rechts|
340
+ tmp = []
341
+
342
+ links.each do |l|
343
+ if kolom.nil? or l.length == kolom
344
+ rechts.each do |r|
345
+ tmp << l + r[1..-1] if l[-1] == r[0]
346
+ end
347
+ end
348
+ end
349
+
350
+ links = tmp
351
+ res.concat(tmp)
352
+ end
353
+
354
+ res = res.sort.uniq
355
+ end
356
+
357
+ def dominoloop(tabellen)
358
+ lres = []
359
+ res = self.dup
360
+ kolom = 2
361
+
362
+ while lres.length != res.length do
363
+ lres = res.dup
364
+ res = res.domino(tabellen, kolom)
365
+
366
+ res.each do |line|
367
+ line << "*" if (line.length != line.uniq.length and line[-1] != "*")
368
+ end
369
+
370
+ $stderr.print "#{100*(res.length)/(lres.length)}% "
371
+
372
+ kolom += 1
373
+ end
374
+
375
+ $stderr.puts ""
376
+
377
+ return res
378
+ end
379
+
380
+ def buildtree
381
+ self.dominoloop([self])
382
+ end
383
+
384
+ def subset(fields, values, results, exact=true, emptyline=nil, joinwith=nil)
385
+ fields = [fields] unless fields.kind_of? Array
386
+ values = [values] unless values.kind_of? Array
387
+ results = [results] unless results.kind_of? Array
388
+ emptyline = emptyline.downcase unless emptyline.nil?
389
+ res = self.dup
390
+ res.delete_if {true}
391
+
392
+ self.each do |l|
393
+ ok = true
394
+
395
+ case l.class.to_s
396
+ when "String"
397
+ c = l.splitwords
398
+ correction = 1
399
+ joinwith = " " if joinwith.nil?
400
+ when "Array"
401
+ c = l
402
+ correction = 0
403
+ end
404
+
405
+ #catch :stop do
406
+ values2 = values.dup
407
+ fields.each do |f|
408
+ v = values2.shift
409
+ v = v.downcase unless v.nil?
410
+ if emptyline.nil? or (not v == emptyline)
411
+ if exact
412
+ unless (v.nil? or c[f-correction].downcase == v)
413
+ ok = false
414
+ #throw :stop
415
+ end
416
+ else
417
+ unless (v.nil? or c[f-correction].downcase.include?(v))
418
+ ok = false
419
+ #throw :stop
420
+ end
421
+ end
422
+ end
423
+ end
424
+ #end
425
+
426
+ if ok
427
+ res2 = []
428
+ results.each do |n|
429
+ res2 << c[n-1]
430
+ end
431
+ res2 = res2.join(joinwith) unless joinwith.nil?
432
+ res << res2
433
+ end
434
+ end
435
+
436
+ return res
437
+ end
438
+
439
+ def format(format)
440
+ res = []
441
+
442
+ [format.length, self.length].min.times do |n|
443
+ case format[n].chr
444
+ when "i" then res << self[n].to_i
445
+ when "s" then res << self[n].to_s
446
+ when "x" then res << self[n]
447
+ end
448
+ end
449
+
450
+ res
451
+ end
452
+
453
+ def to_i
454
+ collect{|c| c.to_i}
455
+ end
456
+
457
+ def to_par
458
+ dash = self.dup
459
+ alpha = self.dup
460
+ numeric = self.dup
461
+
462
+ dash.delete_if do |s|
463
+ not (s =~ /\A-/) or
464
+ (s =~ /\A-?[[:digit:]\.]+\z/) or
465
+ (s =~ /^-+$/)
466
+ end
467
+
468
+ alpha.delete_if do |s|
469
+ ((s =~ /\A-/) or
470
+ (s =~ /\A-?[[:digit:]\.]+\z/)) and
471
+ not ((s =~ /^\.+$/) or (s =~ /^-+$/))
472
+ end
473
+
474
+ numeric.delete_if do |s|
475
+ not (s =~ /\A-?[[:digit:]\.]+\z/) or
476
+ (s =~ /^\.+$/)
477
+ end
478
+
479
+ raise "Oops!" if dash.length + alpha.length + numeric.length != length
480
+
481
+ return dash, alpha, numeric
482
+ end
483
+
484
+ def self.file(file)
485
+ res = new
486
+
487
+ File.open(file) do |f|
488
+ f.readlines.uncomment.chomp.each do |line|
489
+ res << line
490
+ end
491
+ end
492
+
493
+ res
494
+ end
495
+
496
+ def numsort
497
+ sort do |a, b|
498
+ a2 = a.to_fs
499
+ b2 = b.to_fs
500
+
501
+ if a2.class != b2.class
502
+ a2 = a
503
+ b2 = b
504
+ end
505
+
506
+ a2 <=> b2
507
+ end
508
+ end
509
+
510
+ def to_fs
511
+ collect{|s| s.to_fs}
512
+ end
513
+
514
+ def chaos
515
+ res = self.dup
516
+
517
+ (length^2).times do
518
+ a = rand(length)
519
+ b = rand(length)
520
+
521
+ res[a], res[b] = res[b], res[a]
522
+ end
523
+
524
+ res
525
+ end
526
+
527
+ def any
528
+ if empty?
529
+ nil
530
+ else
531
+ self[rand(self.length)]
532
+ end
533
+ end
534
+
535
+ def minmax
536
+ min, value, max = self
537
+ [min, [value, max].min].max
538
+ end
539
+
540
+ def ids
541
+ collect{|e| e.ids}
542
+ end
543
+ end
544
+
545
+ class Hash
546
+ def save(file, append=false)
547
+ org = {}
548
+ org = Hash.file(file) if (append and File.file?(file))
549
+
550
+ self.sort.each do |k, v|
551
+ org[k] = v
552
+ end
553
+
554
+ File.open(file, "w") do |f|
555
+ org.sort.each do |k, v|
556
+ f.puts "%s\t= %s" % [k, v]
557
+ end
558
+ end
559
+ end
560
+
561
+ def subset(fields, values, results=nil, exact=true, emptyline=nil, joinwith=nil)
562
+ fields = [fields] unless fields.kind_of? Array
563
+ values = [values] unless values.kind_of? Array
564
+ results = [results] unless results.kind_of? Array
565
+ emptyline = emptyline.downcase unless emptyline.nil?
566
+ res = self.dup
567
+ res.delete_if {true}
568
+
569
+ self.each do |k, l|
570
+ ok = true
571
+
572
+ case l.class.to_s
573
+ when "String"
574
+ c = l.splitwords
575
+ correction = 1
576
+ joinwith = " " if joinwith.nil?
577
+ when "Array"
578
+ c = l
579
+ correction = 0
580
+ end
581
+
582
+ #catch :stop do
583
+ values2 = values.dup
584
+ fields.each do |f|
585
+ v = values2.shift
586
+ v = v.downcase unless v.nil?
587
+ if emptyline.nil? or (not v == emptyline)
588
+ if exact
589
+ unless (v.nil? or c[f-correction].downcase == v)
590
+ ok = false
591
+ #throw :stop
592
+ end
593
+ else
594
+ unless (v.nil? or c[f-correction].downcase.include?(v))
595
+ ok = false
596
+ #throw :stop
597
+ end
598
+ end
599
+ end
600
+ end
601
+ #end
602
+
603
+ if ok
604
+ res2 = []
605
+ if results == [nil]
606
+ res2 = c
607
+ else
608
+ results.each do |n|
609
+ res2 << c[n-correction]
610
+ end
611
+ end
612
+ res2 = res2.join(joinwith) unless joinwith.nil?
613
+ res[k] = res2
614
+ end
615
+ end
616
+
617
+ return res
618
+ end
619
+
620
+ def to_i
621
+ collect{|k, v| v.to_i}
622
+ end
623
+
624
+ def self.file(file)
625
+ res = new
626
+
627
+ File.open(file) do |f|
628
+ #f.readlines.chomp.each do |line|
629
+ while line = f.gets do
630
+ line.chomp!
631
+
632
+ unless line.empty?
633
+ k, v = line.split(/\s*=\s*/, 2)
634
+ res[k] = v
635
+ end
636
+ end
637
+ end
638
+
639
+ res
640
+ end
641
+
642
+ def ids
643
+ collect{|k, v| [k, v].ids}
644
+ end
645
+ end
646
+
647
+ def id2ref(id)
648
+ ObjectSpace._id2ref(id)
649
+ end
650
+
651
+ def after(seconds, *args)
652
+ if not seconds.nil? and not seconds.zero?
653
+ Thread.new(*args) do |*args2|
654
+ sleep seconds
655
+ yield(*args2)
656
+ end
657
+ end
658
+ end
659
+
660
+ def every(seconds, *args)
661
+ if not seconds.nil? and not seconds.zero?
662
+ Thread.new(*args) do |*args2|
663
+ loop do
664
+ sleep seconds
665
+ yield(*args2)
666
+ end
667
+ end
668
+ end
669
+ end
670
+
671
+ def evtimeout(seconds)
672
+ begin
673
+ timeout(seconds) do
674
+ yield
675
+ end
676
+ rescue TimeoutError
677
+ end
678
+ end
679
+
680
+ def evtimeoutretry(seconds)
681
+ ok = false
682
+
683
+ while not ok
684
+ evtimeout(seconds) do
685
+ yield
686
+ ok = true
687
+ end
688
+ end
689
+ end
690
+
691
+ def trap(signal)
692
+ Kernel::trap(signal) do
693
+ yield
694
+ end
695
+
696
+ # Seems pointless, but it's for catching ^C under Windows...
697
+
698
+ every(1) {} if windows?
699
+ end
700
+
701
+ def linux?
702
+ not windows? and not cygwin?
703
+ end
704
+
705
+ def windows?
706
+ not (target_os.downcase =~ /32/).nil?
707
+ end
708
+
709
+ def cygwin?
710
+ not (target_os.downcase =~ /cyg/).nil?
711
+ end
712
+
713
+ def target_os
714
+ Config::CONFIG["target_os"] or ""
715
+ end
716
+
717
+ def user
718
+ ENV["USER"] or ENV["USERNAME"]
719
+ end
720
+
721
+ def home
722
+ (ENV["HOME"] or ENV["USERPROFILE"] or (File.directory?("h:/") ? "h:" : "c:")).gsub(/\\/, "/")
723
+ end
724
+
725
+ def temp
726
+ (ENV["TMPDIR"] or ENV["TMP"] or ENV["TEMP"] or "/tmp").gsub(/\\/, "/")
727
+ end
728
+
729
+ def stdtmp
730
+ $stderr = $stdout = File.new("#{temp}/ruby.#{Process.pid}.log", "a") unless ARGV.include?("--rwd-exit")
731
+ end
732
+
733
+ $nobm = false
734
+
735
+ def nobm
736
+ $nobm = true
737
+ end
738
+
739
+ def bm(label="")
740
+ if $nobm
741
+ if block_given?
742
+ return yield
743
+ else
744
+ return nil
745
+ end
746
+ end
747
+
748
+ label = label.to_s
749
+ res = nil
750
+
751
+ $bm_mutex = ($bm_mutex or Mutex.new)
752
+
753
+ $bm_mutex.synchronize do
754
+ if $bm.nil?
755
+ require "ev/bm"
756
+
757
+ $bm = {}
758
+
759
+ at_exit do
760
+ format1 = "%10s %10s %10s %10s %10s %10s %10s"
761
+ format2 = "%10s %10.6f %10.6f %10.6f %10.6f %10.6f %10d"
762
+
763
+ $stderr.puts format1 % ["LABEL", "USERCPU", "SYSCPU", "CUSERCPU", "CSYSCPU", "ELAPSED", "TIMES"]
764
+ $bm.sort{|a, b| [a[1], a[0]] <=> [b[1], b[0]]}.each do |k, v|
765
+ $stderr.puts format2 % [k, *v]
766
+ end
767
+ end
768
+ end
769
+
770
+ $bm[label] = [0.0]*5 + [0] unless $bm.include?(label)
771
+ end
772
+
773
+ if block_given?
774
+ bm = Benchmark.measure{res = yield}
775
+ bma = bm.to_a # [dummy label, user CPU time, system CPU time, childrens user CPU time, childrens system CPU time, elapsed real time]
776
+
777
+ $bm_mutex.synchronize do
778
+ 0.upto(4) do |n|
779
+ $bm[label][n] += bma[n+1]
780
+ end
781
+
782
+ $bm[label][5] += 1
783
+ end
784
+ end
785
+
786
+ res
787
+ end
788
+
789
+ def trace
790
+ res =nil
791
+
792
+ set_trace_func lambda { |event, file, line, id, binding, classname|
793
+ $stderr.printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
794
+ }
795
+
796
+ if block_given?
797
+ res = yield
798
+
799
+ notrace
800
+ end
801
+
802
+ res
803
+ end
804
+
805
+ def notrace
806
+ set_trace_func nil
807
+ end
808
+
809
+ def lambda_cached(&block)
810
+ hash = {}
811
+ lambda do |*args|
812
+ res = hash[args]
813
+ if res.nil?
814
+ res = block.call(*args)
815
+ hash[args] = res
816
+ end
817
+ res
818
+ end
819
+ end