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,267 @@
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
+ require 'rio/matchrecord'
38
+ require 'rio/arycopy'
39
+ require 'rio/grande'
40
+ require 'rio/rectype'
41
+ require 'rio/ops/stream/read'
42
+ require 'rio/context/stream'
43
+ require 'stringio'
44
+ require 'rio/cp'
45
+ require 'rio/piper/cp'
46
+
47
+
48
+ module RIO
49
+ module Ops
50
+ module Stream
51
+ module Input
52
+ include Status
53
+ include Ops::Stream::Read
54
+ include Enumerable
55
+ include Grande
56
+ include Cp::Stream::Input
57
+ include Piper::Cp::Input
58
+ end
59
+ end
60
+ end
61
+ end
62
+ require 'rio/piper'
63
+ module RIO
64
+ module Ops
65
+ module Stream
66
+ module Input
67
+ public
68
+ def each(*args,&block)
69
+ #p callstr('each',*args)
70
+ each_(*args,&block)
71
+ self
72
+ end
73
+ def empty?()
74
+ self.eof?
75
+ end
76
+ def each_record(*args,&block)
77
+ #p callstr('each_record',*args)
78
+ each_record_(*args,&block)
79
+ self
80
+ end
81
+
82
+ def each_row(*args,&block)
83
+ #p callstr('each_row',*args)
84
+ rows(*args).each_row_(*args,&block)
85
+ self
86
+ end
87
+
88
+ def get()
89
+ until self.eof?
90
+ raw_rec = self._get_rec
91
+ return to_rec_(raw_rec) if @get_selrej.match?(raw_rec,@recno)
92
+ end
93
+ self.close if closeoneof?
94
+ nil
95
+ # (closeoneof? ? self.on_eof_close{ nil } : nil)
96
+ end
97
+ def get_type(itertype,&block)
98
+ old_itertype = cx['stream_itertype']
99
+ _set_itertype(itertype)
100
+ begin
101
+ ans = yield
102
+ ensure
103
+ _set_itertype(old_itertype)
104
+ end
105
+ ans
106
+ end
107
+ def getline()
108
+ get_type('lines') { get() }
109
+ end
110
+ def getrow()
111
+ get_type('rows') { get() }
112
+ end
113
+ def getrec()
114
+ get_type('records') { get() }
115
+ end
116
+ private
117
+
118
+ def _ss_like_array(selrej)
119
+ selrej.only_one_fixnum? and !dir_iter?
120
+ end
121
+
122
+ protected
123
+
124
+ # iterate over the records, yielding only with matching records
125
+ # implemented in terms of an underlying iterator like each_line (see RIO::RecType::*)
126
+ def each_(*args,&block)
127
+ selrej,rangetops = create_selrej()
128
+ want_ma = block.arity > 1
129
+ catch(:stop_iter) do
130
+ each_rec_ do |raw_rec|
131
+ _got_rec(raw_rec)
132
+ rangetops = check_passed_ranges(selrej,@recno) if rangetops and @recno > rangetops[0]
133
+ if as = selrej.match?(raw_rec,@recno)
134
+ if want_ma
135
+ yield(to_rec_(raw_rec),as)
136
+ else
137
+ yield(to_rec_(raw_rec))
138
+ end
139
+ end
140
+ end
141
+ return closeoneof? ? self.close : self
142
+ end
143
+ closeoneof? ? self.close : self
144
+ end
145
+
146
+ # iterate over the records, yielding only with matching records
147
+ # implemented in terms of get_ (see RIO::RecType::*)
148
+ def each_record_(*args,&block)
149
+ #p callstr('each_record_',*args)
150
+
151
+ selrej,rangetops = self.create_selrej()
152
+ get_arg = self.get_arg_
153
+ self.each_record_init_(*args)
154
+ catch(:stop_iter) {
155
+ until ior.eof?
156
+ break unless raw_rec = self._get_rec(get_arg)
157
+ rangetops = check_passed_ranges(selrej,@recno) if rangetops and @recno > rangetops[0]
158
+ yield to_rec_(raw_rec) if selrej.match?(raw_rec,@recno)
159
+ end
160
+ return self
161
+ }
162
+ closeoneof? ? self.close : self
163
+ end
164
+ alias :each_row_ :each_
165
+ def clear_selection()
166
+ cx.delete('stream_sel')
167
+ cx.delete('stream_nosel')
168
+ self
169
+ end
170
+ def _get_rec(arg=get_arg_)
171
+ _got_rec(self.get_(arg))
172
+ end
173
+
174
+ def to_rec_(record)
175
+ record
176
+ end
177
+
178
+ private
179
+
180
+ def _got_rec(el=nil)
181
+ @recno += 1 unless el.nil?
182
+ el
183
+ end
184
+
185
+ protected
186
+
187
+ def each_record_init_
188
+ end
189
+ def handle_skipped
190
+ return self unless cx.has_key?('skip_args')
191
+ args = cx['skip_args'] || []
192
+ self.skiprecords_(*args)
193
+ end
194
+ def create_selrej()
195
+ sel_args = cx['stream_sel']
196
+ nosel_args = cx['stream_nosel']
197
+ handle_skipped
198
+ selrej = RIO::Match::Record::SelRej.new(self,sel_args,nosel_args)
199
+ [selrej,selrej.rangetops]
200
+ end
201
+
202
+ def check_passed_ranges(selrej,recno)
203
+ throw :stop_iter if selrej.remove_passed_ranges(recno).never?
204
+ selrej.rangetops
205
+ end
206
+
207
+ def on_closeoneof()
208
+ #p "on_closeoneof #{self.object_id} #{self.ior.object_id}"
209
+ self.close
210
+ end
211
+
212
+ private
213
+
214
+ def _ss_keys() Cx::SS::STREAM_KEYS end
215
+
216
+ def auto(&block)
217
+ rewind if autorewind?
218
+ yield
219
+ end
220
+
221
+ public
222
+
223
+ def rewind(&block)
224
+ self.ior.rewind
225
+ @recno = -1
226
+ each(&block) if block_given?
227
+ self
228
+ end
229
+
230
+ def close_read(&block)
231
+ self.ior.close_read
232
+ each(&block) if block_given?
233
+ self
234
+ end
235
+
236
+ def copy_stream(dst)
237
+ #p callstr('copy_stream',dst)
238
+ ior.copy_stream(dst)
239
+ self
240
+ end
241
+
242
+ def recno()
243
+ return nil unless @recno >= 0
244
+ @recno
245
+ end
246
+
247
+ def to_h
248
+ { self.to_s => self.to_a }
249
+ end
250
+
251
+
252
+ def each_0(sel,&block)
253
+ if sel.match_all?
254
+ each_rec_(&block)
255
+ else
256
+ each_rec_ { |rec|
257
+ next unless mtch = sel.match?(rec,@recno)
258
+ val = (mtch.kind_of?(::MatchData) && mtch.size > 1 ? mtch.to_a[1...mtch.length] : rec)
259
+ yield val
260
+ }
261
+ end
262
+ self
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
@@ -0,0 +1,100 @@
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
+ require 'rio/cp'
38
+
39
+ module RIO
40
+ module Impl
41
+ module U
42
+ def self.copy_stream(s,d)
43
+ require 'fileutils'
44
+ ::FileUtils::copy_stream(s,d)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ module RIO
50
+ module Ops
51
+ module Stream
52
+ module Output
53
+ include Status
54
+ require 'rio/ops/stream/write'
55
+ include Ops::Stream::Write
56
+ include Cp::Stream::Output
57
+ def putrec(rec,*args)
58
+ self.put_(rec,*args)
59
+ self
60
+ end
61
+
62
+ def putrec!(rec,*args)
63
+ rtn_close { self.put_(rec,*args) }
64
+ end
65
+
66
+ def close_write(&block)
67
+ self.iow.close_write
68
+ each(&block) if block_given?
69
+ self
70
+ end
71
+
72
+ def wclose
73
+ self.close.softreset
74
+ end
75
+
76
+ def then_close(*args,&block)
77
+ rtn = yield(*args)
78
+ wclose
79
+ rtn
80
+ end
81
+
82
+ def rtn_close(*args,&block)
83
+ yield(*args)
84
+ wclose
85
+ end
86
+
87
+ def copyclose()
88
+ #p "#{callstr('copyclose')} closeoncopy=#{cx['closeoncopy']} iow=#{iow}"
89
+ #raise RuntimeError,"copclose"
90
+ if cx['closeoncopy']
91
+ wclose
92
+ else
93
+ self
94
+ end
95
+ end
96
+
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,86 @@
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
+ module Ops
40
+ module Stream
41
+ module Read
42
+
43
+ private
44
+
45
+ def _post_eof_close(&block)
46
+ rtn = yield
47
+ self.close if closeoneof?
48
+ rtn
49
+ end
50
+ def _pre_eof_close(&block)
51
+ begin
52
+ closit = ior.eof? && closeoneof?
53
+ rtn = yield
54
+ ensure
55
+ self.close if closit
56
+ end
57
+ rtn
58
+ end
59
+
60
+ public
61
+
62
+ def contents() _post_eof_close { ior.gets(nil) || "" } end
63
+ def readlines(*args) _post_eof_close { ior.readlines(*args) } end
64
+ def each_line(*args,&block)
65
+ _post_eof_close { ior.each_line(*args,&block) }
66
+ end
67
+ def each_byte(*args,&block) _post_eof_close { ior.each_byte(*args,&block) } end
68
+ def each_bytes(nb,*args,&block) _post_eof_close { ior.each_bytes(nb,&block) } end
69
+
70
+ def read(*args) _pre_eof_close { ior.read(*args) } end
71
+ def gets(*args) _pre_eof_close { ior.gets(*args) } end
72
+ def readline(*args) _pre_eof_close { ior.readline(*args) } end
73
+ def readpartial(*args) _pre_eof_close { ior.readpartial(*args) } end
74
+ def readchar(*args) _pre_eof_close { ior.readchar(*args) } end
75
+ def getc(*args) _pre_eof_close { ior.getc(*args) } end
76
+
77
+ def ungetc(*args)
78
+ ior.ungetc(*args)
79
+ self
80
+ end
81
+ def lineno() ior.lineno end
82
+ def lineno=(arg) ior.lineno = arg end
83
+ end
84
+ end
85
+ end
86
+ end