wishdev-rio 0.4.3.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.
Files changed (296) hide show
  1. data/COPYING +341 -0
  2. data/README +81 -0
  3. data/Rakefile +281 -0
  4. data/build_doc.rb +94 -0
  5. data/doc/ANNOUNCE +159 -0
  6. data/doc/RELEASE_NOTES +308 -0
  7. data/doc/RIOIS +215 -0
  8. data/doc/generators/template/html/rio.css +428 -0
  9. data/doc/generators/template/html/rio.rb +523 -0
  10. data/doc/generators/template/html/ugly.rb +132 -0
  11. data/doc/pkg_def.rb +60 -0
  12. data/doc/rfc1738.txt +1403 -0
  13. data/doc/rfc959.txt +3933 -0
  14. data/ex/catcsv.rb +64 -0
  15. data/ex/colx.rb +8 -0
  16. data/ex/findinruby +15 -0
  17. data/ex/findruby +14 -0
  18. data/ex/passwd_report.rb +8 -0
  19. data/ex/prompt.rb +25 -0
  20. data/ex/rgb.txt.gz +0 -0
  21. data/ex/riocat +42 -0
  22. data/ex/riogunzip +31 -0
  23. data/ex/riogzip +24 -0
  24. data/ex/rioprompt.rb +10 -0
  25. data/ex/targz2zip +17 -0
  26. data/ex/tonl +10 -0
  27. data/lib/rio/abstract_method.rb +56 -0
  28. data/lib/rio/argv.rb +56 -0
  29. data/lib/rio/arycopy.rb +43 -0
  30. data/lib/rio/assert.rb +114 -0
  31. data/lib/rio/base.rb +56 -0
  32. data/lib/rio/callstr.rb +46 -0
  33. data/lib/rio/const.rb +51 -0
  34. data/lib/rio/construct.rb +50 -0
  35. data/lib/rio/constructor.rb +258 -0
  36. data/lib/rio/context/autoclose.rb +72 -0
  37. data/lib/rio/context/copying.rb +55 -0
  38. data/lib/rio/context/cxx.rb +66 -0
  39. data/lib/rio/context/dir.rb +120 -0
  40. data/lib/rio/context/gzip.rb +50 -0
  41. data/lib/rio/context/methods.rb +182 -0
  42. data/lib/rio/context/skip.rb +66 -0
  43. data/lib/rio/context/stream.rb +229 -0
  44. data/lib/rio/context.rb +117 -0
  45. data/lib/rio/cp.rb +370 -0
  46. data/lib/rio/def.rb +53 -0
  47. data/lib/rio/dir.rb +144 -0
  48. data/lib/rio/doc/EXAMPLES.rb +299 -0
  49. data/lib/rio/doc/HOWTO.rb +737 -0
  50. data/lib/rio/doc/INDEX.rb +311 -0
  51. data/lib/rio/doc/INTRO.rb +1068 -0
  52. data/lib/rio/doc/OPTIONAL.rb +130 -0
  53. data/lib/rio/doc/SYNOPSIS.rb +183 -0
  54. data/lib/rio/doc.rb +45 -0
  55. data/lib/rio/entrysel.rb +246 -0
  56. data/lib/rio/exception/copy.rb +97 -0
  57. data/lib/rio/exception/notimplemented.rb +57 -0
  58. data/lib/rio/exception/notsupported.rb +46 -0
  59. data/lib/rio/exception/open.rb +61 -0
  60. data/lib/rio/exception/state.rb +73 -0
  61. data/lib/rio/exception.rb +41 -0
  62. data/lib/rio/ext/csv.rb +351 -0
  63. data/lib/rio/ext/if.rb +45 -0
  64. data/lib/rio/ext/mp3info.rb +80 -0
  65. data/lib/rio/ext/splitlines.rb +253 -0
  66. data/lib/rio/ext/yaml/doc.rb +133 -0
  67. data/lib/rio/ext/yaml/tie.rb +149 -0
  68. data/lib/rio/ext/yaml.rb +164 -0
  69. data/lib/rio/ext/zipfile/fs.rb +116 -0
  70. data/lib/rio/ext/zipfile/rl.rb +251 -0
  71. data/lib/rio/ext/zipfile/rootdir.rb +117 -0
  72. data/lib/rio/ext/zipfile/state.rb +161 -0
  73. data/lib/rio/ext/zipfile/wrap.rb +204 -0
  74. data/lib/rio/ext/zipfile.rb +110 -0
  75. data/lib/rio/ext.rb +138 -0
  76. data/lib/rio/factory.rb +436 -0
  77. data/lib/rio/file.rb +118 -0
  78. data/lib/rio/filter/closeoneof.rb +103 -0
  79. data/lib/rio/filter/gzip.rb +70 -0
  80. data/lib/rio/filter.rb +94 -0
  81. data/lib/rio/fs/base.rb +41 -0
  82. data/lib/rio/fs/impl.rb +122 -0
  83. data/lib/rio/fs/native.rb +75 -0
  84. data/lib/rio/fs/stream.rb +61 -0
  85. data/lib/rio/fs/url.rb +63 -0
  86. data/lib/rio/ftp/conncache.rb +101 -0
  87. data/lib/rio/ftp/dir.rb +94 -0
  88. data/lib/rio/ftp/fs.rb +180 -0
  89. data/lib/rio/ftp/ftpfile.rb +20 -0
  90. data/lib/rio/grande.rb +97 -0
  91. data/lib/rio/handle.rb +100 -0
  92. data/lib/rio/if/basic.rb +64 -0
  93. data/lib/rio/if/csv.rb +76 -0
  94. data/lib/rio/if/dir.rb +157 -0
  95. data/lib/rio/if/file.rb +89 -0
  96. data/lib/rio/if/fileordir.rb +268 -0
  97. data/lib/rio/if/grande.rb +729 -0
  98. data/lib/rio/if/grande_entry.rb +379 -0
  99. data/lib/rio/if/grande_stream.rb +693 -0
  100. data/lib/rio/if/internal.rb +125 -0
  101. data/lib/rio/if/path.rb +462 -0
  102. data/lib/rio/if/rubyio.rb +681 -0
  103. data/lib/rio/if/string.rb +83 -0
  104. data/lib/rio/if/temp.rb +45 -0
  105. data/lib/rio/if/test.rb +282 -0
  106. data/lib/rio/if/yaml.rb +206 -0
  107. data/lib/rio/if.rb +64 -0
  108. data/lib/rio/ioh.rb +162 -0
  109. data/lib/rio/iomode.rb +109 -0
  110. data/lib/rio/ios/fail.rb +106 -0
  111. data/lib/rio/ios/generic.rb +119 -0
  112. data/lib/rio/ios/mode.rb +60 -0
  113. data/lib/rio/ios/null.rb +119 -0
  114. data/lib/rio/iowrap.rb +128 -0
  115. data/lib/rio/kernel.rb +54 -0
  116. data/lib/rio/local.rb +62 -0
  117. data/lib/rio/match.rb +53 -0
  118. data/lib/rio/matchrecord.rb +283 -0
  119. data/lib/rio/no_warn.rb +49 -0
  120. data/lib/rio/nullio.rb +159 -0
  121. data/lib/rio/open3.rb +68 -0
  122. data/lib/rio/ops/construct.rb +61 -0
  123. data/lib/rio/ops/create.rb +77 -0
  124. data/lib/rio/ops/dir.rb +346 -0
  125. data/lib/rio/ops/either.rb +134 -0
  126. data/lib/rio/ops/file.rb +102 -0
  127. data/lib/rio/ops/path.rb +296 -0
  128. data/lib/rio/ops/stream/input.rb +267 -0
  129. data/lib/rio/ops/stream/output.rb +100 -0
  130. data/lib/rio/ops/stream/read.rb +86 -0
  131. data/lib/rio/ops/stream/write.rb +57 -0
  132. data/lib/rio/ops/stream.rb +87 -0
  133. data/lib/rio/ops/symlink.rb +80 -0
  134. data/lib/rio/path/reset.rb +69 -0
  135. data/lib/rio/path.rb +129 -0
  136. data/lib/rio/piper/cp.rb +80 -0
  137. data/lib/rio/piper.rb +122 -0
  138. data/lib/rio/prompt.rb +66 -0
  139. data/lib/rio/rectype.rb +88 -0
  140. data/lib/rio/rl/base.rb +118 -0
  141. data/lib/rio/rl/builder.rb +117 -0
  142. data/lib/rio/rl/chmap.rb +66 -0
  143. data/lib/rio/rl/fs2url.rb +82 -0
  144. data/lib/rio/rl/ioi.rb +78 -0
  145. data/lib/rio/rl/path.rb +110 -0
  146. data/lib/rio/rl/pathmethods.rb +116 -0
  147. data/lib/rio/rl/uri.rb +200 -0
  148. data/lib/rio/rl/withpath.rb +296 -0
  149. data/lib/rio/scheme/aryio.rb +88 -0
  150. data/lib/rio/scheme/cmdio.rb +80 -0
  151. data/lib/rio/scheme/cmdpipe.rb +118 -0
  152. data/lib/rio/scheme/fd.rb +65 -0
  153. data/lib/rio/scheme/ftp.rb +141 -0
  154. data/lib/rio/scheme/http.rb +78 -0
  155. data/lib/rio/scheme/null.rb +55 -0
  156. data/lib/rio/scheme/path.rb +98 -0
  157. data/lib/rio/scheme/stderr.rb +55 -0
  158. data/lib/rio/scheme/stdio.rb +71 -0
  159. data/lib/rio/scheme/strio.rb +87 -0
  160. data/lib/rio/scheme/sysio.rb +63 -0
  161. data/lib/rio/scheme/tcp.rb +75 -0
  162. data/lib/rio/scheme/temp.rb +200 -0
  163. data/lib/rio/state/error.rb +72 -0
  164. data/lib/rio/state.rb +242 -0
  165. data/lib/rio/stream/base.rb +54 -0
  166. data/lib/rio/stream/duplex.rb +79 -0
  167. data/lib/rio/stream/open.rb +202 -0
  168. data/lib/rio/stream.rb +181 -0
  169. data/lib/rio/symantics.rb +45 -0
  170. data/lib/rio/tempdir.rb +132 -0
  171. data/lib/rio/to_rio/all.rb +39 -0
  172. data/lib/rio/to_rio/array.rb +39 -0
  173. data/lib/rio/to_rio/io.rb +40 -0
  174. data/lib/rio/to_rio/object.rb +42 -0
  175. data/lib/rio/to_rio/string.rb +40 -0
  176. data/lib/rio/to_rio.rb +67 -0
  177. data/lib/rio/uri/file.rb +198 -0
  178. data/lib/rio/util.rb +48 -0
  179. data/lib/rio/version.rb +51 -0
  180. data/lib/rio.rb +162 -0
  181. data/setup.rb +1360 -0
  182. data/test/bin/count_lines.rb +11 -0
  183. data/test/bin/find_lines.rb +13 -0
  184. data/test/bin/list_dir.rb +14 -0
  185. data/test/ftp/all.rb +9 -0
  186. data/test/ftp/anon_copy_data.rb +36 -0
  187. data/test/ftp/anon_misc.rb +124 -0
  188. data/test/ftp/anon_read.rb +105 -0
  189. data/test/ftp/anon_special.rb +68 -0
  190. data/test/ftp/anon_write.rb +70 -0
  191. data/test/ftp/ftp2ftp.rb +51 -0
  192. data/test/ftp/initftpfiles.rb +14 -0
  193. data/test/ftp/testdef.rb +55 -0
  194. data/test/gem_runtests.rb +15 -0
  195. data/test/http/all.rb +4 -0
  196. data/test/http/copy-from-http.rb +141 -0
  197. data/test/http/uri-meta.rb +72 -0
  198. data/test/lib/temp_server.rb +46 -0
  199. data/test/runalltests.rb +17 -0
  200. data/test/runftptests.rb +14 -0
  201. data/test/runhttp.rb +11 -0
  202. data/test/runhttptests.rb +14 -0
  203. data/test/runtests.rb +52 -0
  204. data/test/tc/abs.rb +355 -0
  205. data/test/tc/all.rb +80 -0
  206. data/test/tc/base.rb +31 -0
  207. data/test/tc/base2.rb +87 -0
  208. data/test/tc/cd1.rb +113 -0
  209. data/test/tc/clearsel.rb +68 -0
  210. data/test/tc/clone.rb +208 -0
  211. data/test/tc/closeoncopy.rb +102 -0
  212. data/test/tc/closeoneof.rb +194 -0
  213. data/test/tc/cmdpipe.rb +149 -0
  214. data/test/tc/copy-dir-samevar.rb +91 -0
  215. data/test/tc/copy-from.rb +129 -0
  216. data/test/tc/copy-to.rb +91 -0
  217. data/test/tc/copy.rb +74 -0
  218. data/test/tc/copyarray.rb +188 -0
  219. data/test/tc/copydest.rb +50 -0
  220. data/test/tc/copydir.rb +166 -0
  221. data/test/tc/copydirlines.rb +121 -0
  222. data/test/tc/copylines.rb +46 -0
  223. data/test/tc/copynonex.rb +118 -0
  224. data/test/tc/copysymlink.rb +39 -0
  225. data/test/tc/create.rb +114 -0
  226. data/test/tc/csv.rb +226 -0
  227. data/test/tc/csv2.rb +138 -0
  228. data/test/tc/csv_columns.rb +37 -0
  229. data/test/tc/csvutil.rb +56 -0
  230. data/test/tc/dir.rb +76 -0
  231. data/test/tc/dir_iter.rb +383 -0
  232. data/test/tc/dirautoclose.rb +67 -0
  233. data/test/tc/dirent.rb +178 -0
  234. data/test/tc/dirss.rb +81 -0
  235. data/test/tc/each.rb +111 -0
  236. data/test/tc/each_break.rb +243 -0
  237. data/test/tc/edf.rb +81 -0
  238. data/test/tc/empty.rb +51 -0
  239. data/test/tc/emptyriodir.rb +129 -0
  240. data/test/tc/entary.rb +227 -0
  241. data/test/tc/entsel.rb +110 -0
  242. data/test/tc/eq.rb +101 -0
  243. data/test/tc/expand_path.rb +69 -0
  244. data/test/tc/ext.rb +136 -0
  245. data/test/tc/fileno.rb +94 -0
  246. data/test/tc/files_select.rb +92 -0
  247. data/test/tc/get.rb +152 -0
  248. data/test/tc/getrec.rb +137 -0
  249. data/test/tc/gzip.rb +109 -0
  250. data/test/tc/io_each_byte.rb +60 -0
  251. data/test/tc/io_read.rb +80 -0
  252. data/test/tc/iometh.rb +149 -0
  253. data/test/tc/likeio.rb +116 -0
  254. data/test/tc/line_record_row.rb +51 -0
  255. data/test/tc/lineno.rb +196 -0
  256. data/test/tc/lines.rb +66 -0
  257. data/test/tc/misc.rb +432 -0
  258. data/test/tc/nolines.rb +204 -0
  259. data/test/tc/noqae.rb +879 -0
  260. data/test/tc/null.rb +45 -0
  261. data/test/tc/once.rb +6 -0
  262. data/test/tc/overload.rb +140 -0
  263. data/test/tc/pa.rb +158 -0
  264. data/test/tc/path_parts.rb +175 -0
  265. data/test/tc/pathop.rb +60 -0
  266. data/test/tc/paths.rb +145 -0
  267. data/test/tc/pid.rb +31 -0
  268. data/test/tc/piper.rb +143 -0
  269. data/test/tc/programs_util.rb +24 -0
  270. data/test/tc/qae.rb +493 -0
  271. data/test/tc/qae_riovar.rb +499 -0
  272. data/test/tc/readline.rb +30 -0
  273. data/test/tc/records.rb +68 -0
  274. data/test/tc/rename.rb +233 -0
  275. data/test/tc/rename_assign.rb +45 -0
  276. data/test/tc/riorl.rb +181 -0
  277. data/test/tc/route.rb +51 -0
  278. data/test/tc/selnosel.rb +33 -0
  279. data/test/tc/skip.rb +89 -0
  280. data/test/tc/skiplines.rb +71 -0
  281. data/test/tc/split.rb +28 -0
  282. data/test/tc/splitlines.rb +65 -0
  283. data/test/tc/splitpath.rb +83 -0
  284. data/test/tc/sub.rb +46 -0
  285. data/test/tc/symlink.rb +176 -0
  286. data/test/tc/symlink0.rb +348 -0
  287. data/test/tc/symlink1.rb +114 -0
  288. data/test/tc/synopsis.rb +75 -0
  289. data/test/tc/temp.rb +152 -0
  290. data/test/tc/tempdir.rb +60 -0
  291. data/test/tc/tempfile.rb +66 -0
  292. data/test/tc/testcase.rb +170 -0
  293. data/test/tc/tonl.rb +37 -0
  294. data/test/tc/truncate.rb +39 -0
  295. data/test/tc/yaml.rb +275 -0
  296. metadata +387 -0
@@ -0,0 +1,283 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ module RIO
38
+ module Match #:nodoc: all
39
+ module Record
40
+
41
+ class Base
42
+ def initialize(arg)
43
+ @select_arg = arg
44
+ end
45
+ def inspect
46
+ @select_arg.inspect
47
+ end
48
+ def val()
49
+ @select_arg
50
+ end
51
+ def match_all?() false end
52
+ def match_none?() false end
53
+ end
54
+ class All < Base
55
+ def match?(val,recno) true end
56
+ def match_all?() true end
57
+ end
58
+ class None < Base
59
+ def match?(val,recno) false end
60
+ def match_none?() true end
61
+ end
62
+ class RegExp < Base
63
+ def match?(val,recno)
64
+ @select_arg.match(val)
65
+ end
66
+ end
67
+ class Range < Base
68
+ def match?(val,recno)
69
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
70
+ @select_arg === recno
71
+ end
72
+ end
73
+ class Fixnum < Base
74
+ def match?(val,recno)
75
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
76
+ @select_arg === recno
77
+ end
78
+ end
79
+ class Proc < Base
80
+ def initialize(arg,therio)
81
+ super(arg)
82
+ @therio = therio
83
+ end
84
+ def match?(val,recno)
85
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
86
+ args = [val,recno,@therio]
87
+ @select_arg.call(*args[0,@select_arg.arity])
88
+ end
89
+ end
90
+ class Symbol < Base
91
+ def match?(val,recno)
92
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
93
+ val.__send__(@select_arg)
94
+ end
95
+ end
96
+ class And < Base
97
+ def initialize(matches,therio)
98
+ list = []
99
+ matches.each do |arg|
100
+ list << Match::Record.create(therio,arg)
101
+ end
102
+ super(list)
103
+ @therio = therio
104
+ end
105
+ def match?(val,recno)
106
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
107
+ @select_arg.all? { |sel| sel.match?(val,recno) }
108
+ end
109
+ end
110
+ class Case < Base
111
+ def match?(val,recno)
112
+ #p "match?(#{val},#{recno}) select_arg=#{@select_arg}"
113
+ @select_arg === val
114
+ end
115
+ end
116
+ def create(therio,arg)
117
+ case arg
118
+ when ::Regexp
119
+ Match::Record::RegExp.new(arg)
120
+ when ::Range
121
+ Match::Record::Range.new(arg)
122
+ when ::Proc
123
+ Match::Record::Proc.new(arg,therio)
124
+ when ::Symbol
125
+ Match::Record::Symbol.new(arg)
126
+ when ::Fixnum
127
+ Match::Record::Fixnum.new(arg)
128
+ when ::Array
129
+ Match::Record::And.new(arg,therio)
130
+ else
131
+ Match::Record::Case.new(arg)
132
+ end
133
+ end
134
+ module_function :create
135
+ end
136
+ end
137
+
138
+ module Match
139
+ module Record
140
+ # for a sellist
141
+ # nil indicates no call was made, so nothing selected
142
+ # empty indicates a call was made, so all selected
143
+ # contents should be checked for matches
144
+ # if contents are removed the list should become nil, not empty
145
+ class SelList
146
+ def initialize(therio,args)
147
+ if args.nil?
148
+ @list = nil
149
+ else
150
+ @list = []
151
+ args.each do |arg|
152
+ @list << create_sel(therio,arg)
153
+ end
154
+ end
155
+ #p "SelList(#{args.inspect},#{@list.inspect})"
156
+ end
157
+ def inspect
158
+ @list.inspect
159
+ end
160
+ def size() @list.size unless @list.nil? end
161
+ def only_one_fixnum?()
162
+ @list && @list.size == 1 && @list[0].kind_of?(Match::Record::Fixnum)
163
+ end
164
+ def delete_at(index)
165
+ @list.delete_at(index)
166
+ @list = nil if @list.empty?
167
+ end
168
+ def self.create(therio,args)
169
+ new(therio,args) unless args.nil?
170
+ end
171
+ def ranges()
172
+ @list.nil? ? [] : @list.select { |sel| sel.kind_of?(Record::Range) }
173
+ end
174
+ def remove_passed_ranges(n)
175
+ return nil if @list.nil?
176
+ return self if @list.empty?
177
+ newlist = []
178
+ @list.each do |sel|
179
+ newlist << sel unless sel.kind_of?(Match::Record::Range) and sel.val.max < n
180
+ end
181
+ @list = (newlist.empty? ? nil : newlist) if newlist.length != @list.length
182
+ @list.nil? ? nil : self
183
+ end
184
+ def create_sel(therio,arg)
185
+ Match::Record.create(therio,arg)
186
+ # case arg
187
+ # when ::Regexp
188
+ # Match::Record::RegExp.new(arg)
189
+ # when ::Range
190
+ # Match::Record::Range.new(arg)
191
+ # when ::Proc
192
+ # Match::Record::Proc.new(arg,therio)
193
+ # when ::Symbol
194
+ # Match::Record::Symbol.new(arg)
195
+ # when ::Fixnum
196
+ # Match::Record::Fixnum.new(arg)
197
+ # when ::Array
198
+ # Match::Record::And.new(arg)
199
+ # else
200
+ # raise ArgumentError,"Argument must be a Regexp,Range,Fixnum,Proc, or Symbol"
201
+ # end
202
+ end
203
+ def match?(val,recno)
204
+ # !@list.nil? && (@list.empty? || @list.detect { |sel| sel.match?(val,recno) } || false) && true
205
+ return false if @list.nil?
206
+ return true if @list.empty?
207
+ as = nil
208
+ al = @list.detect { |sel| as = sel.match?(val,recno)
209
+ #p "1: #{$1} as[match?]: #{as.inspect}"
210
+ as
211
+ }
212
+ #p "[SelList.match?] as:#{as.inspect} al:#{al.inspect}"
213
+ return as if al
214
+ return false
215
+ end
216
+ def always?() !@list.nil? && @list.empty? end
217
+ def never?() @list.nil? end
218
+ end
219
+
220
+
221
+ class SelRej
222
+ def initialize(therio,sel_args,rej_args)
223
+ @sel = SelList.create(therio,sel_args)
224
+ @rej = SelList.create(therio,rej_args)
225
+ @always = init_always()
226
+ end
227
+ def only_one_fixnum?()
228
+ @rej.nil? && @sel && @sel.only_one_fixnum?
229
+ end
230
+ def init_always(reset=false)
231
+ if @sel.nil? and @rej.nil?
232
+ !reset
233
+ elsif @rej.nil? and @sel.always?
234
+ true
235
+ elsif @sel.nil?
236
+ false
237
+ elsif !@rej.nil? and @rej.always?
238
+ false
239
+ else
240
+ nil
241
+ end
242
+ end
243
+ def remove_passed_ranges(n)
244
+ @sel = @sel.remove_passed_ranges(n) unless @sel.nil?
245
+ @rej = @rej.remove_passed_ranges(n) unless @rej.nil?
246
+ @always = init_always(true)
247
+ self
248
+ end
249
+ def rangetops()
250
+ rtops = ranges.map { |r| r.val.max }.sort.uniq
251
+ rtops.empty? ? nil : rtops
252
+ end
253
+ def ranges()
254
+ (@sel.nil? ? [] : @sel.ranges) + (@rej.nil? ? [] : @rej.ranges)
255
+ end
256
+ def class_tail
257
+ self.class.to_s.sub(/^.+::/,'')
258
+ end
259
+ def inspect
260
+ sprintf("#<%s:0x%08x @always=%s @sel=%s @rej=%s>",self.class_tail,self.object_id,@always.inspect,
261
+ @sel.inspect,@rej.inspect)
262
+ end
263
+ def always?()
264
+ @always == true
265
+ end
266
+ def never?()
267
+ @always == false
268
+ end
269
+ def match?(val,recno)
270
+ #p "match?(#{val},#{recno}) #{self.inspect}"
271
+ return @always unless @always.nil?
272
+ as = nil
273
+ ok = ((!@sel.nil? && (as = @sel.match?(val,recno))) && !(!@rej.nil? && @rej.match?(val,recno)))
274
+ return (ok ? as : ok)
275
+ end
276
+ end
277
+ end
278
+ end
279
+ end
280
+
281
+
282
+
283
+
@@ -0,0 +1,49 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+ module RIO
38
+ # Based on a suggestion posted by Andrew L. Johnson to comp.lang.ruby
39
+ def no_warn
40
+ begin
41
+ verbose = $VERBOSE
42
+ $VERBOSE = nil
43
+ yield
44
+ ensure
45
+ $VERBOSE = verbose
46
+ end
47
+ end
48
+ module_function :no_warn
49
+ end
data/lib/rio/nullio.rb ADDED
@@ -0,0 +1,159 @@
1
+ #--
2
+ # ===============================================================================
3
+ # Copyright (c) 2005,2006,2007 Christopher Kleckner
4
+ # All rights reserved
5
+ #
6
+ # This file is part of the Rio library for ruby.
7
+ #
8
+ # Rio is free software; you can redistribute it and/or modify
9
+ # it under the terms of the GNU General Public License as published by
10
+ # the Free Software Foundation; either version 2 of the License, or
11
+ # (at your option) any later version.
12
+ #
13
+ # Rio is distributed in the hope that it will be useful,
14
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ # GNU General Public License for more details.
17
+ #
18
+ # You should have received a copy of the GNU General Public License
19
+ # along with Rio; if not, write to the Free Software
20
+ # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ # ===============================================================================
22
+ #++
23
+ #
24
+ # To create the documentation for Rio run the command
25
+ # ruby build_doc.rb
26
+ # from the distribution directory.
27
+ #
28
+ # Suggested Reading
29
+ # * RIO::Doc::SYNOPSIS
30
+ # * RIO::Doc::INTRO
31
+ # * RIO::Doc::HOWTO
32
+ # * RIO::Doc::EXAMPLES
33
+ # * RIO::Rio
34
+ #
35
+
36
+
37
+
38
+ module RIO
39
+ class NotSupportedException < ArgumentError #:nodoc: all
40
+ def self.emsg(fname,obj)
41
+ "#{fname}() is not supported for #{obj.class} objects"
42
+ end
43
+
44
+ end
45
+ class NullIOMode #:nodoc: all
46
+ def initialize(mode_string)
47
+ @str = mode_string
48
+ end
49
+ def to_s() @str end
50
+ def can_write?
51
+ @str =~ /^[aw]/ or @str =~ /\+/
52
+ end
53
+ def can_read?
54
+ @str =~ /^r/ or @str =~ /\+/
55
+ end
56
+ def appends?
57
+ @str =~ /^a/
58
+ end
59
+ def =~(re)
60
+ re =~ @str
61
+ end
62
+ end
63
+ class NullIO #:nodoc: all
64
+ def initialize(a=nil,m='r')
65
+ # p "#{callstr('initialize',a,m)} hnd=#{@hnd.inspect}"
66
+ @lineno = 0
67
+ @open = true
68
+ @mode = NullIOMode.new(m)
69
+ end
70
+ def lineno() @lineno end
71
+ def lineno=(a) @lineno = a end
72
+ def self.open(a=nil,m='r',&block)
73
+ rtn = io = new(a,m)
74
+ if block_given?
75
+ rtn = yield(io)
76
+ io.close
77
+ end
78
+ rtn
79
+ end
80
+ def fileno() nil end
81
+ def flush() nil end
82
+ def fsync() nil end
83
+ def isatty() false end
84
+ def tty?() false end
85
+ def pos() 0 end
86
+ def pos=(n) 0 end
87
+
88
+ def readchar() nil end
89
+ def read() nil end
90
+ def getc() nil end
91
+
92
+ def closed?
93
+ not @open
94
+ end
95
+ def close
96
+ @open = false
97
+ end
98
+ def eof?()
99
+ true
100
+ end
101
+ def each_line(sep_string=$/,&block)
102
+ self
103
+ end
104
+ def each_byte(sep_string=$/,&block)
105
+ nil
106
+ end
107
+ def fcntl(integer_cmd,arg)
108
+ raise NotSupportedException,NotSupportedException.emsg('fcntl',self)
109
+ end
110
+ def ioctl(integer_cmd,arg)
111
+ raise NotSupportedException,NotSupportedException.emsg('fcntl',self)
112
+ end
113
+ alias each each_line
114
+ def gets(sep_string=$/)
115
+ raise IOError,"NullIO is not open for reading" unless @mode.can_read?
116
+ nil
117
+ end
118
+ def readline(sep_string=$/)
119
+ raise EOFError
120
+ end
121
+
122
+ def readlines(sep_string=$/)
123
+ []
124
+ end
125
+ def rewind
126
+ @lineno = 0
127
+ end
128
+ def print(*objs)
129
+ raise IOError,"NullIO is not open for writing" unless @mode.can_write?
130
+ nil
131
+ end
132
+ def close_read(*objs)
133
+ raise IOError,"NullIO is not a duplex stream"
134
+ nil
135
+ end
136
+ def close_write(*objs)
137
+ raise IOError,"NullIO is not a duplex stream"
138
+ nil
139
+ end
140
+ def <<(obj)
141
+ self
142
+ end
143
+ def puts(*objs)
144
+ nil
145
+ end
146
+ def write(string)
147
+ print(string)
148
+ string.size
149
+ end
150
+ def binmode() nil end
151
+ def printf(fmt,*args)
152
+ print(sprintf(fmt,*args))
153
+ end
154
+ def callstr(func,*args)
155
+ self.class.to_s+'['+self.to_s+']'+'.'+func.to_s+'('+args.join(',')+')'
156
+ end
157
+
158
+ end
159
+ end