carray 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. checksums.yaml +4 -4
  2. data/COPYING +56 -0
  3. data/GPL +340 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +33 -0
  6. data/LEGAL +50 -0
  7. data/NOTE +73 -0
  8. data/Rakefile +20 -0
  9. data/TODO +5 -0
  10. data/ca_iter_block.c +242 -0
  11. data/ca_iter_dimension.c +287 -0
  12. data/ca_iter_window.c +202 -0
  13. data/ca_obj_array.c +1189 -0
  14. data/ca_obj_bitarray.c +523 -0
  15. data/ca_obj_bitfield.c +636 -0
  16. data/ca_obj_block.c +885 -0
  17. data/ca_obj_fake.c +405 -0
  18. data/ca_obj_farray.c +482 -0
  19. data/ca_obj_field.c +625 -0
  20. data/ca_obj_grid.c +738 -0
  21. data/ca_obj_mapping.c +614 -0
  22. data/ca_obj_object.c +777 -0
  23. data/ca_obj_reduce.c +299 -0
  24. data/ca_obj_refer.c +627 -0
  25. data/ca_obj_repeat.c +640 -0
  26. data/ca_obj_select.c +558 -0
  27. data/ca_obj_shift.c +952 -0
  28. data/ca_obj_transpose.c +582 -0
  29. data/ca_obj_unbound_repeat.c +557 -0
  30. data/ca_obj_window.c +1023 -0
  31. data/carray.h +1381 -0
  32. data/carray_access.c +1798 -0
  33. data/carray_attribute.c +903 -0
  34. data/carray_call_cfunc.c +1107 -0
  35. data/carray_cast.c +1155 -0
  36. data/carray_cast_func.rb +498 -0
  37. data/carray_class.c +132 -0
  38. data/carray_conversion.c +518 -0
  39. data/carray_copy.c +453 -0
  40. data/carray_core.c +1307 -0
  41. data/carray_element.c +572 -0
  42. data/carray_generate.c +681 -0
  43. data/carray_iterator.c +630 -0
  44. data/carray_loop.c +462 -0
  45. data/carray_mask.c +1174 -0
  46. data/carray_math.rb +834 -0
  47. data/carray_numeric.c +257 -0
  48. data/carray_operator.c +582 -0
  49. data/carray_order.c +1040 -0
  50. data/carray_random.c +529 -0
  51. data/carray_sort_addr.c +261 -0
  52. data/carray_stat.c +2102 -0
  53. data/carray_stat_proc.rb +1990 -0
  54. data/carray_test.c +602 -0
  55. data/carray_undef.c +69 -0
  56. data/carray_utils.c +740 -0
  57. data/ext/calculus/carray_calculus.c +792 -0
  58. data/ext/calculus/carray_interp.c +355 -0
  59. data/ext/calculus/extconf.rb +12 -0
  60. data/ext/calculus/lib/autoload/autoload_math_calculus.rb +2 -0
  61. data/ext/calculus/lib/math/calculus.rb +119 -0
  62. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +31 -0
  63. data/ext/dataframe/API.txt +11 -0
  64. data/ext/dataframe/extconf.rb +3 -0
  65. data/ext/dataframe/lib/carray/autoload/autoload_dataframe_dataframe.rb +14 -0
  66. data/ext/dataframe/lib/carray/dataframe/dataframe.rb +1104 -0
  67. data/ext/dataframe/sample/test_uniq_sort.rb +5 -0
  68. data/ext/fortio/extconf.rb +3 -0
  69. data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +5 -0
  70. data/ext/fortio/lib/carray/io/fortran_format.rb +43 -0
  71. data/ext/fortio/lib/fortio.rb +3 -0
  72. data/ext/fortio/lib/fortio/fortran_format.rb +603 -0
  73. data/ext/fortio/lib/fortio/fortran_format.tab.rb +536 -0
  74. data/ext/fortio/lib/fortio/fortran_format.y +215 -0
  75. data/ext/fortio/lib/fortio/fortran_namelist.rb +151 -0
  76. data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +470 -0
  77. data/ext/fortio/lib/fortio/fortran_namelist.y +213 -0
  78. data/ext/fortio/lib/fortio/fortran_sequential.rb +345 -0
  79. data/ext/fortio/ruby_fortio.c +182 -0
  80. data/ext/fortio/test/test_H.rb +5 -0
  81. data/ext/fortio/test/test_T.rb +7 -0
  82. data/ext/fortio/test/test_fortran_format.rb +86 -0
  83. data/ext/fortio/test/test_namelist.rb +25 -0
  84. data/ext/fortio/test/test_sequential.rb +13 -0
  85. data/ext/fortio/test/test_sequential2.rb +13 -0
  86. data/ext/fortio/work/test.rb +10 -0
  87. data/ext/fortio/work/test_e.rb +19 -0
  88. data/ext/fortio/work/test_ep.rb +10 -0
  89. data/ext/fortio/work/test_parse.rb +12 -0
  90. data/ext/imagemap/carray_imagemap.c +495 -0
  91. data/ext/imagemap/doc/call_graph.dot +28 -0
  92. data/ext/imagemap/draw.c +567 -0
  93. data/ext/imagemap/extconf.rb +13 -0
  94. data/ext/imagemap/lib/autoload/autoload_graphics_imagemap.rb +1 -0
  95. data/ext/imagemap/lib/graphics/imagemap.rb +273 -0
  96. data/ext/imagemap/lib/image_map.rb +4 -0
  97. data/ext/imagemap/test/swath_index.rb +83 -0
  98. data/ext/imagemap/test/swath_warp.rb +99 -0
  99. data/ext/imagemap/test/test.rb +23 -0
  100. data/ext/imagemap/test/test_image.rb +42 -0
  101. data/ext/imagemap/test/test_line.rb +14 -0
  102. data/ext/imagemap/test/test_rotate.rb +17 -0
  103. data/ext/imagemap/test/test_triangle.rb +20 -0
  104. data/ext/imagemap/test/test_warp.rb +26 -0
  105. data/ext/mathfunc/carray_mathfunc.c +321 -0
  106. data/ext/mathfunc/extconf.rb +18 -0
  107. data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +1 -0
  108. data/ext/mathfunc/lib/math/mathfunc.rb +15 -0
  109. data/ext/mathfunc/test/test_hypot.rb +5 -0
  110. data/ext/mathfunc/test/test_j0.rb +22 -0
  111. data/ext/mathfunc/test/test_jn.rb +8 -0
  112. data/ext/mathfunc/test/test_sph.rb +9 -0
  113. data/ext/narray/README +22 -0
  114. data/ext/narray/ca_wrap_narray.c +491 -0
  115. data/ext/narray/carray_narray.c +21 -0
  116. data/ext/narray/extconf.rb +57 -0
  117. data/ext/narray/lib/autoload/autoload_math_narray.rb +1 -0
  118. data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +11 -0
  119. data/ext/narray/lib/math/narray.rb +17 -0
  120. data/ext/narray/lib/math/narray_miss.rb +45 -0
  121. data/extconf.rb +3 -25
  122. data/lib/carray.rb +28 -0
  123. data/lib/carray/autoload/autoload_base.rb +23 -0
  124. data/lib/carray/autoload/autoload_graphics_gnuplot.rb +2 -0
  125. data/lib/carray/autoload/autoload_io_csv.rb +14 -0
  126. data/lib/carray/autoload/autoload_io_excel.rb +5 -0
  127. data/lib/carray/autoload/autoload_io_imagemagick.rb +6 -0
  128. data/lib/carray/autoload/autoload_io_pg.rb +6 -0
  129. data/lib/carray/autoload/autoload_io_sqlite3.rb +12 -0
  130. data/lib/carray/autoload/autoload_io_table.rb +1 -0
  131. data/lib/carray/autoload/autoload_math_histogram.rb +5 -0
  132. data/lib/carray/autoload/autoload_math_interp.rb +4 -0
  133. data/lib/carray/autoload/autoload_math_recurrence.rb +6 -0
  134. data/lib/carray/autoload/autoload_object_iterator.rb +1 -0
  135. data/lib/carray/autoload/autoload_object_link.rb +1 -0
  136. data/lib/carray/autoload/autoload_object_pack.rb +2 -0
  137. data/lib/carray/base/autoload.rb +94 -0
  138. data/lib/carray/base/basic.rb +1051 -0
  139. data/lib/carray/base/inspect.rb +252 -0
  140. data/lib/carray/base/iterator.rb +367 -0
  141. data/lib/carray/base/math.rb +403 -0
  142. data/lib/carray/base/obsolete.rb +93 -0
  143. data/lib/carray/base/serialize.rb +260 -0
  144. data/lib/carray/base/struct.rb +634 -0
  145. data/lib/carray/graphics/gnuplot.rb +2116 -0
  146. data/lib/carray/info.rb +112 -0
  147. data/lib/carray/io/csv.rb +560 -0
  148. data/lib/carray/io/excel.rb +26 -0
  149. data/lib/carray/io/imagemagick.rb +231 -0
  150. data/lib/carray/io/pg.rb +101 -0
  151. data/lib/carray/io/sqlite3.rb +202 -0
  152. data/lib/carray/io/table.rb +77 -0
  153. data/lib/carray/math/histogram.rb +179 -0
  154. data/lib/carray/math/interp.rb +57 -0
  155. data/lib/carray/math/interp/adapter_gsl_spline.rb +47 -0
  156. data/lib/carray/math/recurrence.rb +95 -0
  157. data/lib/carray/mkmf.rb +145 -0
  158. data/lib/carray/object/ca_obj_iterator.rb +52 -0
  159. data/lib/carray/object/ca_obj_link.rb +52 -0
  160. data/lib/carray/object/ca_obj_pack.rb +101 -0
  161. data/mkmath.rb +731 -0
  162. data/mt19937ar.c +182 -0
  163. data/mt19937ar.h +86 -0
  164. data/rdoc_main.rb +27 -0
  165. data/rdoc_math.rb +5 -0
  166. data/rdoc_stat.rb +31 -0
  167. data/ruby_carray.c +242 -0
  168. data/ruby_ccomplex.c +497 -0
  169. data/ruby_float_func.c +83 -0
  170. data/spec/CABlockIterator/CABlockIterator_spec.rb +113 -0
  171. data/spec/CArray/bug/store_spec.rb +27 -0
  172. data/spec/CArray/index/repeat_spec.rb +10 -0
  173. data/spec/CArray/method/eq_spec.rb +80 -0
  174. data/spec/CArray/method/is_nan_spec.rb +12 -0
  175. data/spec/CArray/method/ne_spec.rb +18 -0
  176. data/spec/CArray/method/round_spec.rb +11 -0
  177. data/spec/CArray/object/_attribute_spec.rb +32 -0
  178. data/spec/CArray/object/s_new_spec.rb +31 -0
  179. data/spec/CArray/serialize/Serialization_spec.rb +89 -0
  180. data/spec/spec_all.rb +11 -0
  181. data/test/test_ALL.rb +50 -0
  182. data/test/test_CABitfield.rb +59 -0
  183. data/test/test_CABlock.rb +208 -0
  184. data/test/test_CAField.rb +40 -0
  185. data/test/test_CAGrid.rb +76 -0
  186. data/test/test_CAMapping.rb +106 -0
  187. data/test/test_CAMmap.rb +11 -0
  188. data/test/test_CARefer.rb +94 -0
  189. data/test/test_CARepeat.rb +66 -0
  190. data/test/test_CASelect.rb +23 -0
  191. data/test/test_CAShift.rb +17 -0
  192. data/test/test_CATranspose.rb +61 -0
  193. data/test/test_CAVirtual.rb +214 -0
  194. data/test/test_CAWindow.rb +55 -0
  195. data/test/test_CAWrap.rb +9 -0
  196. data/test/test_CArray.rb +228 -0
  197. data/test/test_CComplex.rb +83 -0
  198. data/test/test_CScalar.rb +91 -0
  199. data/test/test_attribute.rb +281 -0
  200. data/test/test_block_iterator.rb +17 -0
  201. data/test/test_boolean.rb +99 -0
  202. data/test/test_cast.rb +33 -0
  203. data/test/test_class.rb +85 -0
  204. data/test/test_complex.rb +43 -0
  205. data/test/test_composite.rb +125 -0
  206. data/test/test_convert.rb +79 -0
  207. data/test/test_copy.rb +141 -0
  208. data/test/test_creation.rb +85 -0
  209. data/test/test_element.rb +146 -0
  210. data/test/test_extream.rb +55 -0
  211. data/test/test_generate.rb +75 -0
  212. data/test/test_index.rb +71 -0
  213. data/test/test_mask.rb +578 -0
  214. data/test/test_math.rb +98 -0
  215. data/test/test_narray.rb +64 -0
  216. data/test/test_order.rb +147 -0
  217. data/test/test_random.rb +15 -0
  218. data/test/test_ref_store.rb +211 -0
  219. data/test/test_stat.rb +414 -0
  220. data/test/test_struct.rb +72 -0
  221. data/test/test_virtual.rb +49 -0
  222. data/utils/ca_ase.rb +21 -0
  223. data/utils/ca_methods.rb +15 -0
  224. data/utils/cast_checker.rb +30 -0
  225. data/utils/create_rdoc.sh +9 -0
  226. data/utils/diff_method.rb +52 -0
  227. data/utils/extract_rdoc.rb +27 -0
  228. data/utils/make_tgz.sh +3 -0
  229. data/utils/remove_resource_fork.sh +5 -0
  230. data/version.h +3 -3
  231. metadata +266 -1
@@ -0,0 +1,5 @@
1
+ require "carray"
2
+
3
+ ca = CArray.int(63636).random(54)
4
+
5
+ p ca.uniq
@@ -0,0 +1,3 @@
1
+ require "mkmf"
2
+
3
+ create_makefile("fortio_ext")
@@ -0,0 +1,5 @@
1
+
2
+ class CArray
3
+ autoload_method "self.from_fortran_format", "carray/io/fortran_format"
4
+ autoload_method "to_fortran_format", "carray/io/fortran_format"
5
+ end
@@ -0,0 +1,43 @@
1
+ require "fortio"
2
+
3
+ class CArray
4
+
5
+ def self.from_fortran_format (fmt, io)
6
+ case io
7
+ when String
8
+ io = StringIO.new(io)
9
+ end
10
+ case fmt
11
+ when String
12
+ fmt = FortranFormat.new(fmt)
13
+ end
14
+ data = []
15
+ begin
16
+ data << fmt.read(io)
17
+ end until io.eof?
18
+ return data.to_ca
19
+ end
20
+
21
+ def to_fortran_format (fmt, input="")
22
+ case input
23
+ when String
24
+ io = StringIO.new(input)
25
+ else
26
+ io = input
27
+ end
28
+ case fmt
29
+ when String
30
+ fmt = FortranFormat.new(fmt)
31
+ end
32
+ n = fmt.count_args
33
+ attach {
34
+ self[nil].blocks(0...n).each do |blk|
35
+ fmt.write(io, *blk.to_a)
36
+ end
37
+ }
38
+ return input
39
+ end
40
+
41
+ end
42
+
43
+
@@ -0,0 +1,3 @@
1
+ require "fortio/fortran_format"
2
+ require "fortio/fortran_namelist"
3
+ require "fortio/fortran_sequential"
@@ -0,0 +1,603 @@
1
+ # ----------------------------------------------------------------------------
2
+ #
3
+ # carray/io/fortran_format.rb
4
+ #
5
+ # This file is part of Ruby/CArray extension library.
6
+ # You can redistribute it and/or modify it under the terms of
7
+ # the Ruby Licence.
8
+ #
9
+ # Copyright (C) 2005 Hiroki Motoyoshi
10
+ #
11
+ # ----------------------------------------------------------------------------
12
+ #
13
+ # Supported format descriptors
14
+ # ----------------------------
15
+ # nFw.d : floating point
16
+ # nEw.d : floating point
17
+ # nDw.d : floating point
18
+ # nGw.d : floating point
19
+ # nESw.d :
20
+ # nEd : exponential
21
+ # nIw(.d) : integer
22
+ # nLw : logical
23
+ # nAw : string
24
+ # nX : write n white space or skip reading by n-characters
25
+ # Tn : move to n-character from line head
26
+ # TLn : move left relative by n-characters
27
+ # TRn : move right relative by n-characters
28
+ # +P, -P
29
+ # S, SP, SS
30
+ # BN,BZ
31
+ # nH... : hollerith string (e.g. 5Hhello)
32
+ # '...', "..." : quoted string
33
+ # / : line feed
34
+ # $ : surppress line feed
35
+ #
36
+ # Short methods
37
+ # -------------
38
+ #
39
+ # ### fortran_format(fmt, *vals)
40
+ #
41
+ # ### fortran_format_write(io, fmt, *vals)
42
+ #
43
+ # ### fortran_format_read(io, fmt)
44
+ #
45
+
46
+
47
+ require "fortio_ext"
48
+ require "fortio/fortran_format.tab"
49
+ require "stringio"
50
+
51
+ class FortranFormat
52
+
53
+ FORMAT_POOL = Hash.new { |hash, fmt|
54
+ hash[fmt] = FortranFormatParser.new.parse(fmt)
55
+ }
56
+
57
+ def self.reset
58
+ FORMAT_POOL.clear
59
+ end
60
+
61
+ def initialize (fmt)
62
+ @format = FORMAT_POOL[fmt]
63
+ end
64
+
65
+ def write (io, *list)
66
+ io ||= ""
67
+ buf = StringIO.new()
68
+ @format.write_as_root(buf, list)
69
+ io << buf.string
70
+ return io
71
+ end
72
+
73
+ def read (io, list = [])
74
+ if io.is_a?(String)
75
+ io = StringIO.new(io)
76
+ end
77
+ @format.read_as_root(io, list)
78
+ return list
79
+ end
80
+
81
+ def count_args
82
+ return @format.count_args
83
+ end
84
+
85
+ def inspect
86
+ return "<FortranFormat: #{@format.inspect}>"
87
+ end
88
+
89
+ end
90
+
91
+ def FortranFormat.check_length (len, str)
92
+ if str.length > len
93
+ return "*" * len
94
+ else
95
+ return str
96
+ end
97
+ end
98
+
99
+ def FortranFormat (fmt)
100
+ return FortranFormat.new(fmt)
101
+ end
102
+
103
+ def fortran_format_write (io, fmt, *data)
104
+ if fmt.is_a?(FortranFormat)
105
+ return fmt.write(io, *data)
106
+ else
107
+ return FortranFormat.new(fmt).write(io, *data)
108
+ end
109
+ end
110
+
111
+ def fortran_format_read (io, fmt)
112
+ if fmt.is_a?(FortranFormat)
113
+ return fmt.read(io)
114
+ else
115
+ return FortranFormat.new(fmt).read(io)
116
+ end
117
+ end
118
+
119
+ def fortran_format (fmt, *data)
120
+ return fortran_format_write(nil, fmt, *data)
121
+ end
122
+
123
+ class FortranFormatParser
124
+
125
+ State = Struct.new(:scale, :sign, :zero, :continue, :pos0, :tab_move)
126
+
127
+ Group = Struct.new(:count, :member)
128
+ class Group
129
+ def write_as_root (io, list)
130
+ state = State.new(0, false, false, false, io.pos, false)
131
+ write(io, list, state)
132
+ if state.continue
133
+ if state.tab_move
134
+ io.string.gsub!(/\000/, ' ')
135
+ end
136
+ else
137
+ if state.tab_move
138
+ io.string.gsub!(/\000/, ' ')
139
+ io.seek(0, IO::SEEK_END)
140
+ end
141
+ io.puts
142
+ end
143
+ end
144
+ def write (io, list, state)
145
+ count.times do |i|
146
+ member.each do |mem|
147
+ mem.write(io, list, state)
148
+ end
149
+ end
150
+ end
151
+ def read_as_root (io, list)
152
+ state = State.new(0, false, false, false, io.pos, false)
153
+ read(io, list, state)
154
+ unless state.continue
155
+ io.gets
156
+ end
157
+ end
158
+ def read (io, list, state)
159
+ count.times do |i|
160
+ member.each do |mem|
161
+ mem.read(io, list, state)
162
+ end
163
+ end
164
+ end
165
+ def count_args
166
+ return count*member.inject(0){|s,m| s + m.count_args}
167
+ end
168
+ def inspect
169
+ count_str = count == 1 ? "" : count.to_s
170
+ return "#{count_str}(" + member.map{|x| x.inspect}.join(",")+ ')'
171
+ end
172
+ end
173
+
174
+ class Continue
175
+ def write (io, list, state)
176
+ state.continue = true
177
+ end
178
+ def read (io, list, state)
179
+ state.continue = true
180
+ end
181
+ def count_args
182
+ return 0
183
+ end
184
+ def inspect
185
+ return "$"
186
+ end
187
+ end
188
+
189
+ Flush = Struct.new(:count)
190
+ class Flush
191
+ def write (io, list, state)
192
+ io << "\n" * count
193
+ end
194
+ def read (io, list, state)
195
+ count.times do
196
+ io.gets
197
+ end
198
+ end
199
+ def count_args
200
+ return count
201
+ end
202
+ def inspect
203
+ count_str = count == 1 ? "" : count.to_s
204
+ return "#{count_str}/"
205
+ end
206
+ end
207
+
208
+ NodeS = Struct.new(:text)
209
+ class NodeS
210
+ def write (io, list, state)
211
+ io << text
212
+ end
213
+ def read (io, list, state)
214
+ raise RuntimeError, "constant string for reading"
215
+ end
216
+ def count_args
217
+ return 0
218
+ end
219
+ def inspect
220
+ if text !~ /'/
221
+ return "'" + text + "'"
222
+ else
223
+ return '"' + text.gsub(/"/, '""') + '"'
224
+ end
225
+ end
226
+ end
227
+
228
+ NodeT= Struct.new(:n)
229
+ class NodeT
230
+ def write (io, list, state)
231
+ io.pos = state.pos0 + n
232
+ state.tab_move = true
233
+ end
234
+ def read (io, list, state)
235
+ io.pos = state.pos0 + n
236
+ end
237
+ def count_args
238
+ return 0
239
+ end
240
+ def inspect
241
+ return "TL#{n}"
242
+ end
243
+ end
244
+
245
+ NodeTL = Struct.new(:n)
246
+ class NodeTL
247
+ def write (io, list, state)
248
+ io.pos -= n
249
+ state.tab_move = true
250
+ end
251
+ def read (io, list, state)
252
+ io.pos -= n
253
+ end
254
+ def count_args
255
+ return 0
256
+ end
257
+ def inspect
258
+ return "TL#{n}"
259
+ end
260
+ end
261
+
262
+ NodeTR = Struct.new(:n)
263
+ class NodeTR
264
+ def write (io, list, state)
265
+ io.pos += n
266
+ state.tab_move = true
267
+ end
268
+ def read (io, list, state)
269
+ io.pos += n
270
+ end
271
+ def count_args
272
+ return 0
273
+ end
274
+ def inspect
275
+ return "TR#{n}"
276
+ end
277
+ end
278
+
279
+ NodeX = Struct.new(:count)
280
+ class NodeX
281
+ def write (io, list, state)
282
+ io << " " * count
283
+ end
284
+ def read (io, list, state)
285
+ io.read(count)
286
+ end
287
+ def count_args
288
+ return 0
289
+ end
290
+ def inspect
291
+ count_str = count == 1 ? "" : count.to_s
292
+ return "#{count_str}X"
293
+ end
294
+ end
295
+
296
+ NodeP = Struct.new(:scale)
297
+ class NodeP
298
+ def write (io, list, state)
299
+ state.scale = scale
300
+ end
301
+ def read (io, list, state)
302
+ state.scale = scale
303
+ end
304
+ def count_args
305
+ return 0
306
+ end
307
+ def inspect
308
+ return "#{scale}P"
309
+ end
310
+ end
311
+
312
+ NodeSp = Struct.new(:sign)
313
+ class NodeSp
314
+ def write (io, list, state)
315
+ state.sign = sign
316
+ end
317
+ def read (io, list, state)
318
+ end
319
+ def count_args
320
+ return 0
321
+ end
322
+ def inspect
323
+ if sign
324
+ return "SP"
325
+ else
326
+ return "SS"
327
+ end
328
+ end
329
+ end
330
+
331
+ NodeB = Struct.new(:zero)
332
+ class NodeB
333
+ def write (io, list, state)
334
+ end
335
+ def read (io, list, state)
336
+ state.zero = zero
337
+ # if zero
338
+ # warn "FortranFormat: BZ is not supported descriptor"
339
+ # end
340
+ end
341
+ def count_args
342
+ return 0
343
+ end
344
+ def inspect
345
+ if zero
346
+ return "BZ"
347
+ else
348
+ return "BN"
349
+ end
350
+ end
351
+ end
352
+
353
+ NodeH = Struct.new(:count, :string)
354
+ class NodeH
355
+ def write (io, list, state)
356
+ io << string
357
+ end
358
+ def read (io, list, state)
359
+ raise "format h is not implemented for reading"
360
+ end
361
+ def count_args
362
+ return count
363
+ end
364
+ def inspect
365
+ count_str = count == 1 ? "" : count.to_s
366
+ return "#{count_str}H#{string}"
367
+ end
368
+ end
369
+
370
+ NodeA = Struct.new(:count, :length)
371
+ class NodeA
372
+ def write (io, list, state)
373
+ len = length
374
+ if len
375
+ count.times do
376
+ str = list.shift
377
+ if str.length > len
378
+ io << str[0,len]
379
+ else
380
+ io << str.rjust(len)
381
+ end
382
+ end
383
+ else
384
+ io << str
385
+ end
386
+ end
387
+ def read (io, list, state)
388
+ str = nil
389
+ if length
390
+ list << (str = io.read(length))
391
+ else
392
+ list << (str = io.read)
393
+ end
394
+ rescue
395
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
396
+ end
397
+ def count_args
398
+ return count
399
+ end
400
+ def inspect
401
+ count_str = count == 1 ? "" : count.to_s
402
+ return "#{count_str}A#{length}"
403
+ end
404
+ end
405
+
406
+ NodeL = Struct.new(:count, :length)
407
+ class NodeL
408
+ def write (io, list, state)
409
+ count.times do
410
+ if list.shift
411
+ io << " "*(length-1) + "T"
412
+ else
413
+ io << " "*(length-1) + "F"
414
+ end
415
+ end
416
+ end
417
+ def read (io, list, state)
418
+ count.times do
419
+ case io.read(length)
420
+ when /\A *?\.?t/i
421
+ list.push(true)
422
+ else
423
+ list.push(false)
424
+ end
425
+ end
426
+ end
427
+ def count_args
428
+ return count
429
+ end
430
+ def inspect
431
+ count_str = count == 1 ? "" : count.to_s
432
+ return "#{count_str}L#{length}"
433
+ end
434
+ end
435
+
436
+ NodeI = Struct.new(:count, :length, :prec)
437
+ class NodeI
438
+ def write (io, list, state)
439
+ if prec
440
+ if state.sign
441
+ fmt = "%#{length-prec}s%+0#{prec-1}i"
442
+ else
443
+ fmt = "%#{length-prec}s%0#{prec}i"
444
+ end
445
+ else
446
+ if state.sign
447
+ fmt = "%s%+#{length-1}i"
448
+ else
449
+ fmt = "%s%#{length}i"
450
+ end
451
+ end
452
+ count.times do
453
+ str = format(fmt, "", list.shift)
454
+ io << FortranFormat.check_length(length, str)
455
+ end
456
+ end
457
+ def read (io, list, state)
458
+ str = nil
459
+ count.times do
460
+ str = io.read(length)
461
+ if state.zero
462
+ list << str.gsub(/ /,'0').to_i
463
+ else
464
+ list << Integer(str)
465
+ end
466
+ end
467
+ rescue
468
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
469
+ end
470
+ def count_args
471
+ return count
472
+ end
473
+ def inspect
474
+ count_str = count == 1 ? "" : count.to_s
475
+ if prec
476
+ return "#{count_str}I#{length}.#{prec}"
477
+ else
478
+ return "#{count_str}I#{length}"
479
+ end
480
+ end
481
+ end
482
+
483
+ NodeF = Struct.new(:count, :length, :prec)
484
+ class NodeF
485
+ def write (io, list, state)
486
+ count.times do
487
+ str = FortranFormat.write_F(state.sign, state.scale, length, prec, list.shift)
488
+ io << FortranFormat.check_length(length, str)
489
+ end
490
+ end
491
+ def read (io, list, state)
492
+ str = nil
493
+ count.times do
494
+ str = io.read(length)
495
+ if state.zero
496
+ str = str.gsub(/ /,'0')
497
+ end
498
+ list << FortranFormat.read_F(str, state.scale, length, prec)
499
+ end
500
+ rescue
501
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
502
+ end
503
+ def count_args
504
+ return count
505
+ end
506
+ def inspect
507
+ count_str = count == 1 ? "" : count.to_s
508
+ return "#{count_str}F#{length}.#{prec}"
509
+ end
510
+ end
511
+
512
+ NodeE = Struct.new(:count, :length, :prec, :exp)
513
+ class NodeE
514
+ def write (io, list, state)
515
+ count.times do
516
+ str = FortranFormat.write_E(state.sign, state.scale, length, prec, exp, list.shift)
517
+ io << FortranFormat.check_length(length, str)
518
+ end
519
+ end
520
+ def read (io, list, state)
521
+ str = nil
522
+ count.times do
523
+ str = io.read(length)
524
+ if state.zero
525
+ str = str.gsub(/ /,'0')
526
+ end
527
+ list << str.to_f
528
+ end
529
+ rescue
530
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
531
+ end
532
+ def count_args
533
+ return count
534
+ end
535
+ def inspect
536
+ count_str = count == 1 ? "" : count.to_s
537
+ exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
538
+ return "#{count_str}E#{length}.#{prec}#{exp_str}"
539
+ end
540
+ end
541
+
542
+ NodeES = Struct.new(:count, :length, :prec, :exp)
543
+ class NodeES
544
+ def write (io, list, state)
545
+ count.times do
546
+ str = FortranFormat.write_E(state.sign, 1, length, prec, exp, list.shift)
547
+ io << FortranFormat.check_length(length, str)
548
+ end
549
+ end
550
+ def read (io, list, state)
551
+ str = nil
552
+ count.times do
553
+ str = io.read(length)
554
+ if state.zero
555
+ str = str.gsub(/ /,'0')
556
+ end
557
+ list << str.to_f
558
+ end
559
+ rescue
560
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
561
+ end
562
+ def count_args
563
+ return count
564
+ end
565
+ def inspect
566
+ count_str = count == 1 ? "" : count.to_s
567
+ exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
568
+ return "#{count_str}ES#{length}.#{prec}#{exp_str}"
569
+ end
570
+ end
571
+
572
+ NodeG = Struct.new(:count, :length, :prec, :exp)
573
+ class NodeG
574
+ def write (io, list, state)
575
+ count.times do
576
+ str = FortranFormat.write_G(state.sign, state.scale, length, prec, exp, list.shift)
577
+ io << FortranFormat.check_length(length, str)
578
+ end
579
+ end
580
+ def read (io, list, state)
581
+ str = nil
582
+ count.times do
583
+ str = io.read(length)
584
+ if state.zero
585
+ str = str.gsub(/ /,'0')
586
+ end
587
+ list << str.to_f
588
+ end
589
+ rescue
590
+ raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
591
+ end
592
+ def count_args
593
+ return count
594
+ end
595
+ def inspect
596
+ count_str = count == 1 ? "" : count.to_s
597
+ exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
598
+ return "#{count_str}G#{length}.#{prec}#{exp_str}"
599
+ end
600
+ end
601
+
602
+ end
603
+