carray 1.3.6 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (315) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +32 -0
  3. data/LICENSE +22 -0
  4. data/NEWS.md +65 -0
  5. data/README.md +23 -26
  6. data/Rakefile +31 -0
  7. data/TODO.md +17 -0
  8. data/carray.gemspec +24 -31
  9. data/{ca_iter_block.c → ext/ca_iter_block.c} +16 -18
  10. data/{ca_iter_dimension.c → ext/ca_iter_dimension.c} +20 -21
  11. data/{ca_iter_window.c → ext/ca_iter_window.c} +12 -14
  12. data/{ca_obj_array.c → ext/ca_obj_array.c} +451 -176
  13. data/{ca_obj_bitarray.c → ext/ca_obj_bitarray.c} +18 -23
  14. data/{ca_obj_bitfield.c → ext/ca_obj_bitfield.c} +12 -16
  15. data/{ca_obj_block.c → ext/ca_obj_block.c} +47 -54
  16. data/{ca_obj_fake.c → ext/ca_obj_fake.c} +10 -12
  17. data/{ca_obj_farray.c → ext/ca_obj_farray.c} +21 -23
  18. data/{ca_obj_field.c → ext/ca_obj_field.c} +30 -32
  19. data/{ca_obj_grid.c → ext/ca_obj_grid.c} +32 -33
  20. data/{ca_obj_mapping.c → ext/ca_obj_mapping.c} +11 -13
  21. data/{ca_obj_object.c → ext/ca_obj_object.c} +40 -42
  22. data/{ca_obj_reduce.c → ext/ca_obj_reduce.c} +3 -5
  23. data/{ca_obj_refer.c → ext/ca_obj_refer.c} +38 -40
  24. data/{ca_obj_repeat.c → ext/ca_obj_repeat.c} +45 -47
  25. data/{ca_obj_select.c → ext/ca_obj_select.c} +4 -6
  26. data/{ca_obj_shift.c → ext/ca_obj_shift.c} +26 -28
  27. data/{ca_obj_transpose.c → ext/ca_obj_transpose.c} +26 -28
  28. data/{ca_obj_unbound_repeat.c → ext/ca_obj_unbound_repeat.c} +106 -160
  29. data/{ca_obj_window.c → ext/ca_obj_window.c} +33 -35
  30. data/{carray.h → ext/carray.h} +90 -59
  31. data/{carray_access.c → ext/carray_access.c} +244 -109
  32. data/{carray_attribute.c → ext/carray_attribute.c} +161 -207
  33. data/{carray_call_cfunc.c → ext/carray_call_cfunc.c} +1 -3
  34. data/{carray_cast.c → ext/carray_cast.c} +350 -149
  35. data/{carray_cast_func.rb → ext/carray_cast_func.rb} +1 -2
  36. data/{carray_class.c → ext/carray_class.c} +28 -36
  37. data/{carray_conversion.c → ext/carray_conversion.c} +58 -70
  38. data/{carray_copy.c → ext/carray_copy.c} +34 -50
  39. data/{carray_core.c → ext/carray_core.c} +75 -62
  40. data/ext/carray_data_type.c +66 -0
  41. data/{carray_element.c → ext/carray_element.c} +34 -53
  42. data/{carray_generate.c → ext/carray_generate.c} +137 -50
  43. data/{carray_iterator.c → ext/carray_iterator.c} +53 -53
  44. data/{carray_loop.c → ext/carray_loop.c} +77 -106
  45. data/{carray_mask.c → ext/carray_mask.c} +95 -114
  46. data/{carray_math.rb → ext/carray_math.rb} +47 -31
  47. data/ext/{mathfunc/carray_mathfunc.c → carray_mathfunc.c} +1 -3
  48. data/{carray_numeric.c → ext/carray_numeric.c} +43 -46
  49. data/{carray_operator.c → ext/carray_operator.c} +72 -36
  50. data/{carray_order.c → ext/carray_order.c} +73 -217
  51. data/{carray_sort_addr.c → ext/carray_sort_addr.c} +14 -21
  52. data/{carray_stat.c → ext/carray_stat.c} +6 -8
  53. data/{carray_stat_proc.rb → ext/carray_stat_proc.rb} +25 -27
  54. data/{carray_test.c → ext/carray_test.c} +59 -51
  55. data/{carray_undef.c → ext/carray_undef.c} +1 -11
  56. data/{carray_utils.c → ext/carray_utils.c} +12 -4
  57. data/{extconf.rb → ext/extconf.rb} +1 -6
  58. data/{mkmath.rb → ext/mkmath.rb} +13 -3
  59. data/{ruby_carray.c → ext/ruby_carray.c} +20 -8
  60. data/{ruby_ccomplex.c → ext/ruby_ccomplex.c} +1 -3
  61. data/{ruby_float_func.c → ext/ruby_float_func.c} +1 -3
  62. data/ext/version.h +16 -0
  63. data/{version.rb → ext/version.rb} +0 -0
  64. data/lib/carray.rb +52 -10
  65. data/lib/carray/{base/autoload.rb → autoload.rb} +48 -8
  66. data/lib/carray/autoload/autoload_base.rb +1 -5
  67. data/lib/carray/autoload/autoload_gem_cairo.rb +9 -0
  68. data/lib/carray/autoload/autoload_gem_ffi.rb +9 -0
  69. data/lib/carray/autoload/autoload_gem_gnuplot.rb +2 -0
  70. data/lib/carray/autoload/autoload_gem_io_csv.rb +14 -0
  71. data/lib/carray/autoload/autoload_gem_io_pg.rb +6 -0
  72. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +12 -0
  73. data/lib/carray/autoload/autoload_gem_narray.rb +10 -0
  74. data/lib/carray/autoload/autoload_gem_numo_narray.rb +15 -0
  75. data/lib/carray/autoload/autoload_gem_opencv.rb +16 -0
  76. data/lib/carray/autoload/autoload_gem_random.rb +8 -0
  77. data/lib/carray/autoload/autoload_gem_rmagick.rb +23 -0
  78. data/lib/carray/autoload/{autoload_graphics_zimg.rb → autoload_gem_zimg.rb} +0 -0
  79. data/lib/carray/basic.rb +191 -0
  80. data/lib/carray/broadcast.rb +82 -0
  81. data/lib/carray/compose.rb +315 -0
  82. data/lib/carray/construct.rb +460 -0
  83. data/lib/carray/convert.rb +115 -0
  84. data/lib/carray/info.rb +1 -3
  85. data/lib/carray/{base/inspect.rb → inspect.rb} +9 -11
  86. data/lib/carray/io/imagemagick.rb +2 -4
  87. data/lib/carray/{base/iterator.rb → iterator.rb} +6 -6
  88. data/lib/carray/mask.rb +102 -0
  89. data/lib/carray/{base/math.rb → math.rb} +21 -53
  90. data/lib/carray/math/histogram.rb +8 -10
  91. data/lib/carray/math/recurrence.rb +1 -3
  92. data/lib/carray/mkmf.rb +9 -3
  93. data/lib/carray/object/ca_obj_iterator.rb +1 -3
  94. data/lib/carray/object/ca_obj_link.rb +1 -3
  95. data/lib/carray/object/ca_obj_pack.rb +9 -11
  96. data/lib/carray/obsolete.rb +270 -0
  97. data/lib/carray/ordering.rb +181 -0
  98. data/lib/carray/{base/serialize.rb → serialize.rb} +50 -66
  99. data/lib/carray/string.rb +188 -0
  100. data/lib/carray/{base/struct.rb → struct.rb} +19 -21
  101. data/lib/carray/{io/table.rb → table.rb} +1 -9
  102. data/lib/carray/testing.rb +51 -0
  103. data/lib/carray/time.rb +76 -0
  104. data/lib/carray/transform.rb +98 -0
  105. data/misc/Methods.ja.md +182 -0
  106. data/{NOTE → misc/NOTE} +0 -0
  107. data/spec/Classes/CABitfield_spec.rb +58 -0
  108. data/spec/Classes/CABlockIterator_spec.rb +114 -0
  109. data/spec/Classes/CABlock_spec.rb +205 -0
  110. data/spec/Classes/CAField_spec.rb +39 -0
  111. data/spec/Classes/CAGrid_spec.rb +75 -0
  112. data/spec/Classes/CAMap_spec.rb +0 -0
  113. data/{test/test_CAMapping.rb → spec/Classes/CAMapping_spec.rb} +35 -36
  114. data/spec/Classes/CAObject_attribute_spec.rb +33 -0
  115. data/spec/Classes/CAObject_spec.rb +33 -0
  116. data/spec/Classes/CARefer_spec.rb +93 -0
  117. data/spec/Classes/CARepeat_spec.rb +65 -0
  118. data/spec/Classes/CASelect_spec.rb +22 -0
  119. data/spec/Classes/CAShift_spec.rb +16 -0
  120. data/spec/Classes/CAStruct_spec.rb +71 -0
  121. data/{test/test_CATranspose.rb → spec/Classes/CATranspose_spec.rb} +20 -21
  122. data/spec/Classes/CAUnboudRepeat_spec.rb +102 -0
  123. data/spec/Classes/CAWindow_spec.rb +54 -0
  124. data/spec/Classes/CAWrap_spec.rb +8 -0
  125. data/{test/test_CArray.rb → spec/Classes/CArray_spec.rb} +48 -92
  126. data/spec/Classes/CScalar_spec.rb +55 -0
  127. data/spec/Features/feature_130_spec.rb +19 -0
  128. data/spec/Features/feature_attributes_spec.rb +280 -0
  129. data/spec/Features/feature_boolean_spec.rb +98 -0
  130. data/spec/Features/feature_broadcast.rb +116 -0
  131. data/spec/Features/feature_cast_function.rb +19 -0
  132. data/spec/Features/feature_cast_spec.rb +33 -0
  133. data/spec/Features/feature_class_spec.rb +84 -0
  134. data/spec/Features/feature_complex_spec.rb +42 -0
  135. data/{test/test_composite.rb → spec/Features/feature_composite_spec.rb} +17 -18
  136. data/spec/Features/feature_convert_spec.rb +46 -0
  137. data/spec/Features/feature_copy_spec.rb +123 -0
  138. data/spec/Features/feature_creation_spec.rb +84 -0
  139. data/spec/Features/feature_element_spec.rb +144 -0
  140. data/spec/Features/feature_extream_spec.rb +54 -0
  141. data/spec/Features/feature_generate_spec.rb +74 -0
  142. data/spec/Features/feature_index_spec.rb +69 -0
  143. data/spec/Features/feature_mask_spec.rb +580 -0
  144. data/spec/Features/feature_math_spec.rb +97 -0
  145. data/spec/Features/feature_order_spec.rb +146 -0
  146. data/spec/Features/feature_ref_store_spec.rb +209 -0
  147. data/spec/Features/feature_serialization_spec.rb +125 -0
  148. data/spec/Features/feature_stat_spec.rb +397 -0
  149. data/spec/Features/feature_virtual_spec.rb +48 -0
  150. data/spec/Features/method_eq_spec.rb +81 -0
  151. data/spec/Features/method_is_nan_spec.rb +12 -0
  152. data/spec/Features/method_map_spec.rb +54 -0
  153. data/spec/Features/method_max_with.rb +20 -0
  154. data/spec/Features/method_min_with.rb +19 -0
  155. data/spec/Features/method_ne_spec.rb +18 -0
  156. data/spec/Features/method_project_spec.rb +188 -0
  157. data/spec/Features/method_ref_spec.rb +27 -0
  158. data/spec/Features/method_round_spec.rb +11 -0
  159. data/spec/Features/method_s_linspace_spec.rb +48 -0
  160. data/spec/Features/method_s_span_spec.rb +14 -0
  161. data/spec/Features/method_seq_spec.rb +47 -0
  162. data/spec/Features/method_sort_with.rb +43 -0
  163. data/spec/Features/method_sorted_with.rb +29 -0
  164. data/spec/Features/method_span_spec.rb +42 -0
  165. data/spec/Features/method_wrap_readonly_spec.rb +43 -0
  166. data/{test → spec/UnitTest}/test_CAVirtual.rb +0 -0
  167. data/spec/spec_all.rb +0 -1
  168. data/utils/convert_test.rb +73 -0
  169. data/utils/{extract_rdoc.rb → extract_yard.rb} +7 -12
  170. data/{devel → utils}/guess_shape.rb +0 -0
  171. data/utils/{diff_method.rb → monkey_patch_methods.rb} +17 -7
  172. metadata +173 -316
  173. data/COPYING +0 -56
  174. data/GPL +0 -340
  175. data/Gemfile +0 -8
  176. data/Gemfile.lock +0 -33
  177. data/LEGAL +0 -50
  178. data/Makefile +0 -451
  179. data/TODO +0 -5
  180. data/carray_cast_func.c +0 -8670
  181. data/carray_config.h +0 -26
  182. data/carray_math.c +0 -24805
  183. data/carray_random.c +0 -531
  184. data/carray_stat_proc.c +0 -12170
  185. data/ext/calculus/carray_calculus.c +0 -931
  186. data/ext/calculus/carray_interp.c +0 -358
  187. data/ext/calculus/extconf.rb +0 -12
  188. data/ext/calculus/lib/autoload/autoload_math_calculus.rb +0 -2
  189. data/ext/calculus/lib/math/calculus.rb +0 -119
  190. data/ext/calculus/lib/math/interp/adapter_interp1d.rb +0 -31
  191. data/ext/fortio/extconf.rb +0 -3
  192. data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +0 -5
  193. data/ext/fortio/lib/carray/io/fortran_format.rb +0 -43
  194. data/ext/fortio/lib/fortio.rb +0 -3
  195. data/ext/fortio/lib/fortio/fortran_format.rb +0 -605
  196. data/ext/fortio/lib/fortio/fortran_format.tab.rb +0 -536
  197. data/ext/fortio/lib/fortio/fortran_format.y +0 -215
  198. data/ext/fortio/lib/fortio/fortran_namelist.rb +0 -151
  199. data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +0 -470
  200. data/ext/fortio/lib/fortio/fortran_namelist.y +0 -213
  201. data/ext/fortio/lib/fortio/fortran_sequential.rb +0 -345
  202. data/ext/fortio/ruby_fortio.c +0 -182
  203. data/ext/fortio/test/test_H.rb +0 -5
  204. data/ext/fortio/test/test_T.rb +0 -7
  205. data/ext/fortio/test/test_fortran_format.rb +0 -86
  206. data/ext/fortio/test/test_namelist.rb +0 -25
  207. data/ext/fortio/test/test_namelist_write.rb +0 -10
  208. data/ext/fortio/test/test_sequential.rb +0 -13
  209. data/ext/fortio/test/test_sequential2.rb +0 -13
  210. data/ext/fortio/work/test.rb +0 -10
  211. data/ext/fortio/work/test_e.rb +0 -19
  212. data/ext/fortio/work/test_ep.rb +0 -10
  213. data/ext/fortio/work/test_parse.rb +0 -12
  214. data/ext/imagemap/carray_imagemap.c +0 -495
  215. data/ext/imagemap/doc/call_graph.dot +0 -28
  216. data/ext/imagemap/draw.c +0 -567
  217. data/ext/imagemap/extconf.rb +0 -13
  218. data/ext/imagemap/lib/autoload/autoload_graphics_imagemap.rb +0 -1
  219. data/ext/imagemap/lib/graphics/imagemap.rb +0 -273
  220. data/ext/imagemap/lib/image_map.rb +0 -4
  221. data/ext/imagemap/test/swath_index.rb +0 -83
  222. data/ext/imagemap/test/swath_warp.rb +0 -99
  223. data/ext/imagemap/test/test.rb +0 -23
  224. data/ext/imagemap/test/test_image.rb +0 -42
  225. data/ext/imagemap/test/test_line.rb +0 -14
  226. data/ext/imagemap/test/test_rotate.rb +0 -17
  227. data/ext/imagemap/test/test_triangle.rb +0 -20
  228. data/ext/imagemap/test/test_warp.rb +0 -26
  229. data/ext/mathfunc/extconf.rb +0 -18
  230. data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +0 -1
  231. data/ext/mathfunc/lib/math/mathfunc.rb +0 -15
  232. data/ext/mathfunc/test/test_hypot.rb +0 -5
  233. data/ext/mathfunc/test/test_j0.rb +0 -22
  234. data/ext/mathfunc/test/test_jn.rb +0 -8
  235. data/ext/mathfunc/test/test_sph.rb +0 -9
  236. data/ext/narray/README +0 -22
  237. data/ext/narray/ca_wrap_narray.c +0 -500
  238. data/ext/narray/carray_narray.c +0 -21
  239. data/ext/narray/extconf.rb +0 -57
  240. data/ext/narray/lib/autoload/autoload_math_narray.rb +0 -1
  241. data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +0 -11
  242. data/ext/narray/lib/math/narray.rb +0 -17
  243. data/ext/narray/lib/math/narray_miss.rb +0 -45
  244. data/lib/carray/autoload/autoload_graphics_gnuplot.rb +0 -2
  245. data/lib/carray/autoload/autoload_io_csv.rb +0 -14
  246. data/lib/carray/autoload/autoload_io_pg.rb +0 -6
  247. data/lib/carray/autoload/autoload_io_sqlite3.rb +0 -12
  248. data/lib/carray/autoload/autoload_io_table.rb +0 -1
  249. data/lib/carray/autoload/autoload_math_interp.rb +0 -4
  250. data/lib/carray/base/basic.rb +0 -1090
  251. data/lib/carray/base/obsolete.rb +0 -131
  252. data/lib/carray/graphics/gnuplot.rb +0 -2131
  253. data/lib/carray/graphics/zimg.rb +0 -296
  254. data/lib/carray/io/csv.rb +0 -572
  255. data/lib/carray/io/pg.rb +0 -101
  256. data/lib/carray/io/sqlite3.rb +0 -215
  257. data/lib/carray/math/interp.rb +0 -57
  258. data/lib/carray/math/interp/adapter_gsl_spline.rb +0 -47
  259. data/mkmf.log +0 -375
  260. data/mt19937ar.c +0 -182
  261. data/mt19937ar.h +0 -86
  262. data/rdoc_ext.rb +0 -1115
  263. data/rdoc_main.rb +0 -27
  264. data/rdoc_math.rb +0 -5
  265. data/rdoc_stat.rb +0 -31
  266. data/spec/CABlockIterator/CABlockIterator_spec.rb +0 -113
  267. data/spec/CArray/bug/store_spec.rb +0 -27
  268. data/spec/CArray/index/repeat_spec.rb +0 -10
  269. data/spec/CArray/method/eq_spec.rb +0 -80
  270. data/spec/CArray/method/is_nan_spec.rb +0 -12
  271. data/spec/CArray/method/ne_spec.rb +0 -18
  272. data/spec/CArray/method/round_spec.rb +0 -11
  273. data/spec/CArray/object/_attribute_spec.rb +0 -32
  274. data/spec/CArray/object/s_new_spec.rb +0 -31
  275. data/spec/CArray/serialize/Serialization_spec.rb +0 -89
  276. data/test/test_130.rb +0 -23
  277. data/test/test_ALL.rb +0 -51
  278. data/test/test_CABitfield.rb +0 -59
  279. data/test/test_CABlock.rb +0 -208
  280. data/test/test_CAField.rb +0 -40
  281. data/test/test_CAGrid.rb +0 -76
  282. data/test/test_CAMmap.rb +0 -11
  283. data/test/test_CARefer.rb +0 -94
  284. data/test/test_CARepeat.rb +0 -66
  285. data/test/test_CASelect.rb +0 -23
  286. data/test/test_CAShift.rb +0 -17
  287. data/test/test_CAWindow.rb +0 -55
  288. data/test/test_CAWrap.rb +0 -9
  289. data/test/test_CComplex.rb +0 -83
  290. data/test/test_CScalar.rb +0 -91
  291. data/test/test_attribute.rb +0 -281
  292. data/test/test_block_iterator.rb +0 -17
  293. data/test/test_boolean.rb +0 -99
  294. data/test/test_cast.rb +0 -33
  295. data/test/test_class.rb +0 -85
  296. data/test/test_complex.rb +0 -43
  297. data/test/test_convert.rb +0 -79
  298. data/test/test_copy.rb +0 -141
  299. data/test/test_creation.rb +0 -85
  300. data/test/test_element.rb +0 -146
  301. data/test/test_extream.rb +0 -55
  302. data/test/test_generate.rb +0 -75
  303. data/test/test_index.rb +0 -71
  304. data/test/test_mask.rb +0 -578
  305. data/test/test_math.rb +0 -98
  306. data/test/test_narray.rb +0 -64
  307. data/test/test_order.rb +0 -147
  308. data/test/test_random.rb +0 -15
  309. data/test/test_ref_store.rb +0 -211
  310. data/test/test_stat.rb +0 -414
  311. data/test/test_struct.rb +0 -72
  312. data/test/test_virtual.rb +0 -49
  313. data/utils/create_rdoc.sh +0 -9
  314. data/utils/make_tgz.sh +0 -3
  315. data/version.h +0 -18
@@ -1,31 +0,0 @@
1
- # ----------------------------------------------------------------------------
2
- #
3
- # carray/math/interp/adapter_interp1d.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
- require "carray/math/interp"
14
-
15
- class CA::Interp::CAInterp1D < CA::Interp::Adapter
16
-
17
- install_adapter "interp1d"
18
-
19
- def initialize (scales, value, options={})
20
- @y = value
21
- @x = scales
22
- end
23
-
24
- def evaluate (x0)
25
- @y.interpolate(@x, x0)
26
- end
27
-
28
- alias grid evaluate
29
-
30
- end
31
-
@@ -1,3 +0,0 @@
1
- require "mkmf"
2
-
3
- create_makefile("fortio_ext")
@@ -1,5 +0,0 @@
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
@@ -1,43 +0,0 @@
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
-
@@ -1,3 +0,0 @@
1
- require "fortio/fortran_format"
2
- require "fortio/fortran_namelist"
3
- require "fortio/fortran_sequential"
@@ -1,605 +0,0 @@
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
- count.times do
391
- list << (str = io.read(length))
392
- end
393
- else
394
- list << (str = io.read)
395
- end
396
- rescue
397
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
398
- end
399
- def count_args
400
- return count
401
- end
402
- def inspect
403
- count_str = count == 1 ? "" : count.to_s
404
- return "#{count_str}A#{length}"
405
- end
406
- end
407
-
408
- NodeL = Struct.new(:count, :length)
409
- class NodeL
410
- def write (io, list, state)
411
- count.times do
412
- if list.shift
413
- io << " "*(length-1) + "T"
414
- else
415
- io << " "*(length-1) + "F"
416
- end
417
- end
418
- end
419
- def read (io, list, state)
420
- count.times do
421
- case io.read(length)
422
- when /\A *?\.?t/i
423
- list.push(true)
424
- else
425
- list.push(false)
426
- end
427
- end
428
- end
429
- def count_args
430
- return count
431
- end
432
- def inspect
433
- count_str = count == 1 ? "" : count.to_s
434
- return "#{count_str}L#{length}"
435
- end
436
- end
437
-
438
- NodeI = Struct.new(:count, :length, :prec)
439
- class NodeI
440
- def write (io, list, state)
441
- if prec
442
- if state.sign
443
- fmt = "%#{length-prec}s%+0#{prec-1}i"
444
- else
445
- fmt = "%#{length-prec}s%0#{prec}i"
446
- end
447
- else
448
- if state.sign
449
- fmt = "%s%+#{length-1}i"
450
- else
451
- fmt = "%s%#{length}i"
452
- end
453
- end
454
- count.times do
455
- str = format(fmt, "", list.shift)
456
- io << FortranFormat.check_length(length, str)
457
- end
458
- end
459
- def read (io, list, state)
460
- str = nil
461
- count.times do
462
- str = io.read(length)
463
- if state.zero
464
- list << str.gsub(/ /,'0').to_i
465
- else
466
- list << str.to_i
467
- end
468
- end
469
- rescue
470
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
471
- end
472
- def count_args
473
- return count
474
- end
475
- def inspect
476
- count_str = count == 1 ? "" : count.to_s
477
- if prec
478
- return "#{count_str}I#{length}.#{prec}"
479
- else
480
- return "#{count_str}I#{length}"
481
- end
482
- end
483
- end
484
-
485
- NodeF = Struct.new(:count, :length, :prec)
486
- class NodeF
487
- def write (io, list, state)
488
- count.times do
489
- str = FortranFormat.write_F(state.sign, state.scale, length, prec, list.shift)
490
- io << FortranFormat.check_length(length, str)
491
- end
492
- end
493
- def read (io, list, state)
494
- str = nil
495
- count.times do
496
- str = io.read(length)
497
- if state.zero
498
- str = str.gsub(/ /,'0')
499
- end
500
- list << FortranFormat.read_F(str, state.scale, length, prec)
501
- end
502
- rescue
503
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
504
- end
505
- def count_args
506
- return count
507
- end
508
- def inspect
509
- count_str = count == 1 ? "" : count.to_s
510
- return "#{count_str}F#{length}.#{prec}"
511
- end
512
- end
513
-
514
- NodeE = Struct.new(:count, :length, :prec, :exp)
515
- class NodeE
516
- def write (io, list, state)
517
- count.times do
518
- str = FortranFormat.write_E(state.sign, state.scale, length, prec, exp, list.shift)
519
- io << FortranFormat.check_length(length, str)
520
- end
521
- end
522
- def read (io, list, state)
523
- str = nil
524
- count.times do
525
- str = io.read(length)
526
- if state.zero
527
- str = str.gsub(/ /,'0')
528
- end
529
- list << str.to_f
530
- end
531
- rescue
532
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
533
- end
534
- def count_args
535
- return count
536
- end
537
- def inspect
538
- count_str = count == 1 ? "" : count.to_s
539
- exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
540
- return "#{count_str}E#{length}.#{prec}#{exp_str}"
541
- end
542
- end
543
-
544
- NodeES = Struct.new(:count, :length, :prec, :exp)
545
- class NodeES
546
- def write (io, list, state)
547
- count.times do
548
- str = FortranFormat.write_E(state.sign, 1, length, prec, exp, list.shift)
549
- io << FortranFormat.check_length(length, str)
550
- end
551
- end
552
- def read (io, list, state)
553
- str = nil
554
- count.times do
555
- str = io.read(length)
556
- if state.zero
557
- str = str.gsub(/ /,'0')
558
- end
559
- list << str.to_f
560
- end
561
- rescue
562
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
563
- end
564
- def count_args
565
- return count
566
- end
567
- def inspect
568
- count_str = count == 1 ? "" : count.to_s
569
- exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
570
- return "#{count_str}ES#{length}.#{prec}#{exp_str}"
571
- end
572
- end
573
-
574
- NodeG = Struct.new(:count, :length, :prec, :exp)
575
- class NodeG
576
- def write (io, list, state)
577
- count.times do
578
- str = FortranFormat.write_G(state.sign, state.scale, length, prec, exp, list.shift)
579
- io << FortranFormat.check_length(length, str)
580
- end
581
- end
582
- def read (io, list, state)
583
- str = nil
584
- count.times do
585
- str = io.read(length)
586
- if state.zero
587
- str = str.gsub(/ /,'0')
588
- end
589
- list << str.to_f
590
- end
591
- rescue
592
- raise "reading error in fortran format : #{str.dump} for #{self.inspect}"
593
- end
594
- def count_args
595
- return count
596
- end
597
- def inspect
598
- count_str = count == 1 ? "" : count.to_s
599
- exp_str = (exp.nil? or exp == 2) ? "" : "E#{exp}"
600
- return "#{count_str}G#{length}.#{prec}#{exp_str}"
601
- end
602
- end
603
-
604
- end
605
-