carray 1.3.7 → 1.4.0
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.
- checksums.yaml +4 -4
- data/README.md +0 -7
- data/Rakefile +31 -0
- data/carray.gemspec +9 -14
- data/carray.h +4 -0
- data/carray_access.c +50 -8
- data/carray_conversion.c +3 -3
- data/carray_generate.c +67 -1
- data/carray_math.rb +22 -22
- data/carray_operator.c +23 -0
- data/devel/im2col.rb +17 -0
- data/lib/carray.rb +32 -1
- data/lib/carray/autoload/autoload_base.rb +0 -4
- data/lib/carray/autoload/autoload_gem_cairo.rb +9 -0
- data/lib/carray/autoload/autoload_gem_ffi.rb +9 -0
- data/lib/carray/autoload/autoload_gem_gnuplot.rb +2 -0
- data/lib/carray/autoload/autoload_gem_io_csv.rb +14 -0
- data/lib/carray/autoload/autoload_gem_io_pg.rb +6 -0
- data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +12 -0
- data/lib/carray/autoload/autoload_gem_narray.rb +10 -0
- data/lib/carray/autoload/autoload_gem_numo_narray.rb +14 -0
- data/lib/carray/autoload/autoload_gem_opencv.rb +16 -0
- data/lib/carray/autoload/autoload_gem_rmagick.rb +23 -0
- data/lib/carray/autoload/{autoload_graphics_zimg.rb → autoload_gem_zimg.rb} +0 -0
- data/lib/carray/base/autoload.rb +47 -5
- data/lib/carray/base/basic.rb +58 -2
- data/lib/carray/base/math.rb +1 -1
- data/lib/carray/base/string.rb +242 -0
- data/mkmath.rb +12 -2
- data/version.h +5 -5
- metadata +29 -109
- data/Gemfile +0 -8
- data/Gemfile.lock +0 -33
- data/ext/calculus/lib/autoload/autoload_math_calculus.rb +0 -2
- data/ext/fortio/extconf.rb +0 -3
- data/ext/fortio/lib/carray/autoload/autoload_fortran_format.rb +0 -5
- data/ext/fortio/lib/carray/io/fortran_format.rb +0 -43
- data/ext/fortio/lib/fortio.rb +0 -3
- data/ext/fortio/lib/fortio/fortran_format.rb +0 -605
- data/ext/fortio/lib/fortio/fortran_format.tab.rb +0 -536
- data/ext/fortio/lib/fortio/fortran_format.y +0 -215
- data/ext/fortio/lib/fortio/fortran_namelist.rb +0 -151
- data/ext/fortio/lib/fortio/fortran_namelist.tab.rb +0 -470
- data/ext/fortio/lib/fortio/fortran_namelist.y +0 -213
- data/ext/fortio/lib/fortio/fortran_sequential.rb +0 -345
- data/ext/fortio/ruby_fortio.c +0 -182
- data/ext/fortio/test/test_H.rb +0 -5
- data/ext/fortio/test/test_T.rb +0 -7
- data/ext/fortio/test/test_fortran_format.rb +0 -86
- data/ext/fortio/test/test_namelist.rb +0 -25
- data/ext/fortio/test/test_namelist_write.rb +0 -10
- data/ext/fortio/test/test_sequential.rb +0 -13
- data/ext/fortio/test/test_sequential2.rb +0 -13
- data/ext/fortio/work/test.rb +0 -10
- data/ext/fortio/work/test_e.rb +0 -19
- data/ext/fortio/work/test_ep.rb +0 -10
- data/ext/fortio/work/test_parse.rb +0 -12
- data/ext/mathfunc/lib/autoload/autoload_math_mathfunc.rb +0 -1
- data/ext/mathfunc/lib/math/mathfunc.rb +0 -15
- data/ext/narray/README +0 -22
- data/ext/narray/ca_wrap_narray.c +0 -500
- data/ext/narray/carray_narray.c +0 -21
- data/ext/narray/extconf.rb +0 -57
- data/ext/narray/lib/autoload/autoload_math_narray.rb +0 -1
- data/ext/narray/lib/autoload/autoload_math_narray_miss.rb +0 -11
- data/ext/narray/lib/math/narray.rb +0 -17
- data/ext/narray/lib/math/narray_miss.rb +0 -45
- data/lib/carray/autoload/autoload_graphics_gnuplot.rb +0 -2
- data/lib/carray/autoload/autoload_io_csv.rb +0 -14
- data/lib/carray/autoload/autoload_io_numo.rb +0 -9
- data/lib/carray/autoload/autoload_io_pg.rb +0 -6
- data/lib/carray/autoload/autoload_io_sqlite3.rb +0 -12
- data/lib/carray/graphics/gnuplot.rb +0 -2141
- data/lib/carray/graphics/zimg.rb +0 -296
- data/lib/carray/io/csv.rb +0 -572
- data/lib/carray/io/numo.rb +0 -52
- data/lib/carray/io/pg.rb +0 -101
- data/lib/carray/io/sqlite3.rb +0 -215
@@ -1,213 +0,0 @@
|
|
1
|
-
# ----------------------------------------------------------------------------
|
2
|
-
#
|
3
|
-
# carray/io/fortran_namelist.y
|
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
|
-
#
|
14
|
-
# racc fortran_namelist.y -> fortan_namelist.tab.rb
|
15
|
-
#
|
16
|
-
|
17
|
-
class FortranNamelistParser
|
18
|
-
|
19
|
-
prechigh
|
20
|
-
left COMMA
|
21
|
-
left ','
|
22
|
-
left '='
|
23
|
-
preclow
|
24
|
-
|
25
|
-
rule
|
26
|
-
|
27
|
-
namelist_all :
|
28
|
-
namelist
|
29
|
-
| namelist namelist_all
|
30
|
-
|
31
|
-
namelist :
|
32
|
-
header paramlist tailer
|
33
|
-
{ @root[val[0]] = val[1]; @scan.in_namelist = false }
|
34
|
-
|
35
|
-
header :
|
36
|
-
'&' IDENT { result = val[1].downcase }
|
37
|
-
| '$' IDENT { result = val[1].downcase }
|
38
|
-
|
39
|
-
tailer :
|
40
|
-
'$'
|
41
|
-
| '&'
|
42
|
-
| '/'
|
43
|
-
| '&' IDENT { on_error unless val[1] =~ /\Aend\Z/i }
|
44
|
-
| '$' IDENT { on_error unless val[1] =~ /\Aend\Z/i }
|
45
|
-
|
46
|
-
paramlist:
|
47
|
-
paramdef { result = [val[0]] }
|
48
|
-
| paramlist paramdef
|
49
|
-
{ result = val[0] + [val[1]] }
|
50
|
-
| paramlist COMMA paramdef
|
51
|
-
{ result = val[0] + [val[2]] }
|
52
|
-
| paramlist COMMA
|
53
|
-
{ result = val[0] }
|
54
|
-
|
55
|
-
paramdef:
|
56
|
-
IDENT '=' rvalues
|
57
|
-
{ result = ParamDef.new(val[0].downcase.intern, nil, val[2]) }
|
58
|
-
| IDENT '(' array_spec ')' '=' rvalues
|
59
|
-
{ result = ParamDef.new(val[0].downcase.intern, val[2], val[5]) }
|
60
|
-
|
61
|
-
rvalues :
|
62
|
-
abbreb { result = val[0] }
|
63
|
-
| rvalues abbreb
|
64
|
-
{ result = val[0] + val[1] }
|
65
|
-
| rvalues NIL
|
66
|
-
{ result = val[0] + [nil] }
|
67
|
-
| rvalues ',' abbreb
|
68
|
-
{ result = val[0] + val[2] }
|
69
|
-
| IDENT
|
70
|
-
{ result = val[0] }
|
71
|
-
|
72
|
-
abbreb :
|
73
|
-
constant { result = [val[0]] }
|
74
|
-
| DIGITS '*' constant
|
75
|
-
{ result = [val[2]] * val[0] }
|
76
|
-
|
77
|
-
constant :
|
78
|
-
STRING
|
79
|
-
| DIGITS
|
80
|
-
| FLOAT
|
81
|
-
|
82
|
-
array_spec :
|
83
|
-
DIGITS { result = [val[0]-1] }
|
84
|
-
| DIGITS ':' DIGITS
|
85
|
-
{ result = [(val[0]-1)..(val[2]-1)] }
|
86
|
-
| DIGITS ',' array_spec
|
87
|
-
{ result = [val[0]-1] + val[2] }
|
88
|
-
| DIGITS ':' DIGITS ',' array_spec
|
89
|
-
{ result = [(val[0]-1)..(val[2]-1)] + val[4] }
|
90
|
-
|
91
|
-
end
|
92
|
-
|
93
|
-
---- inner
|
94
|
-
|
95
|
-
def parse (str)
|
96
|
-
@scan = FortranNamelistScanner.new(str)
|
97
|
-
@root = {}
|
98
|
-
do_parse
|
99
|
-
return @root
|
100
|
-
end
|
101
|
-
|
102
|
-
def next_token
|
103
|
-
return @scan.yylex
|
104
|
-
end
|
105
|
-
|
106
|
-
---- header
|
107
|
-
|
108
|
-
require "strscan"
|
109
|
-
require "stringio"
|
110
|
-
|
111
|
-
class FortranNamelistScanner
|
112
|
-
|
113
|
-
def initialize (text)
|
114
|
-
@s = StringScanner.new(text)
|
115
|
-
@in_namelist = false
|
116
|
-
end
|
117
|
-
|
118
|
-
attr_accessor :in_namelist
|
119
|
-
|
120
|
-
def yylex
|
121
|
-
while @s.rest?
|
122
|
-
unless @in_namelist
|
123
|
-
case
|
124
|
-
when @s.scan(/\A([\$&])/) ### {$|&}
|
125
|
-
@in_namelist = true
|
126
|
-
return [
|
127
|
-
@s[0],
|
128
|
-
nil
|
129
|
-
]
|
130
|
-
when @s.scan(/\A[^\$&]/)
|
131
|
-
next
|
132
|
-
end
|
133
|
-
else
|
134
|
-
case
|
135
|
-
when @s.scan(/\A[+-]?(\d+)\.(\d+)?([ED][+-]?(\d+))?/i) ### float
|
136
|
-
return [ ### 1.2E+3, 1.E+3, 1.2E3
|
137
|
-
:FLOAT, ### 1.2, 1.
|
138
|
-
@s[0].sub(/D/i,'e').sub(/\.e/,".0e").to_f
|
139
|
-
]
|
140
|
-
when @s.scan(/\A[+-]?\.(\d+)([ED][+-]?(\d+))?/i) ### float
|
141
|
-
return [ ### .2E+3, -.2E+3, .2E3
|
142
|
-
:FLOAT, ### .2, -.2
|
143
|
-
@s[0].sub(/D/i,'e').sub(/\./, '0.').to_f
|
144
|
-
]
|
145
|
-
when @s.scan(/\A[+-]?(\d+)[ED][+-]?(\d+)/i) ### float
|
146
|
-
return [ ### 12E+3, 12E3, 0E0
|
147
|
-
:FLOAT,
|
148
|
-
@s[0].sub(/D/i,'e').to_f
|
149
|
-
]
|
150
|
-
when @s.scan(/\A[\-\+]?\d+/) ### digits
|
151
|
-
return [
|
152
|
-
:DIGITS,
|
153
|
-
Integer(@s[0])
|
154
|
-
]
|
155
|
-
when @s.scan(/\A'((?:''|[^'])*)'/) ### 'quoted string'
|
156
|
-
return [
|
157
|
-
:STRING,
|
158
|
-
@s[1].gsub(/''/, "'")
|
159
|
-
]
|
160
|
-
when @s.scan(/\A"((?:""|[^"])*)"/) ### 'double-quoted string'
|
161
|
-
return [
|
162
|
-
:STRING,
|
163
|
-
@s[1].gsub(/""/, '"')
|
164
|
-
]
|
165
|
-
when @s.scan(/\A,/) ### ,
|
166
|
-
@s.scan(/\A\s+/)
|
167
|
-
while @s.scan(/\A\n\s*/) or @s.scan(/\A\![^\n]*/)
|
168
|
-
### skip comment
|
169
|
-
end
|
170
|
-
if @s.match?(/\A[a-z]\w*/i) or @s.match?(/\A[\&\$\/\!]/)
|
171
|
-
return [
|
172
|
-
:COMMA,
|
173
|
-
nil
|
174
|
-
]
|
175
|
-
elsif @s.match?(/\A,/)
|
176
|
-
return [
|
177
|
-
:NIL,
|
178
|
-
nil
|
179
|
-
]
|
180
|
-
else
|
181
|
-
return [
|
182
|
-
',',
|
183
|
-
nil
|
184
|
-
]
|
185
|
-
end
|
186
|
-
when @s.scan(/\A[\$&\/=\(\):*]/) ### {$|&|/|,|=|(|)|:|*}
|
187
|
-
return [
|
188
|
-
@s[0],
|
189
|
-
nil
|
190
|
-
]
|
191
|
-
when @s.scan(/\A[a-z]\w*/i) ### IDENT
|
192
|
-
return [
|
193
|
-
:IDENT,
|
194
|
-
@s[0]
|
195
|
-
]
|
196
|
-
when @s.scan(/\A\s+/) ### blank
|
197
|
-
next
|
198
|
-
when @s.scan(/\A![^\n]*?\n/) ### comment
|
199
|
-
next
|
200
|
-
when @s.scan(/\A\n/) ### newline
|
201
|
-
next
|
202
|
-
else
|
203
|
-
@s.rest =~ /\A(.*)$/
|
204
|
-
raise "FortranFormat parse error\n\t#{$1}\n\t^"
|
205
|
-
end
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
end
|
211
|
-
|
212
|
-
---- footer
|
213
|
-
|
@@ -1,345 +0,0 @@
|
|
1
|
-
# ----------------------------------------------------------------------------
|
2
|
-
#
|
3
|
-
# fortio/fortran_sequential.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
|
-
#
|
14
|
-
# Format
|
15
|
-
#
|
16
|
-
# real*4 : native endian => "f", "F"
|
17
|
-
# little endian => "e"
|
18
|
-
# big endian => "g"
|
19
|
-
#
|
20
|
-
# real*8 : native endian => "d", "D"
|
21
|
-
# little endian => "E"
|
22
|
-
# big endian => "G"
|
23
|
-
#
|
24
|
-
# integer*2 : native endian => "s"
|
25
|
-
# little endian => "v"
|
26
|
-
# big endian => "n"
|
27
|
-
#
|
28
|
-
# integer*4 : native endian => "l"
|
29
|
-
# little endian => "V"
|
30
|
-
# big endian => "N"
|
31
|
-
#
|
32
|
-
# character : "a"
|
33
|
-
#
|
34
|
-
|
35
|
-
require "stringio"
|
36
|
-
require "carray"
|
37
|
-
|
38
|
-
class FortranSequential
|
39
|
-
|
40
|
-
if "ab".unpack("v").pack("s") == "ab"
|
41
|
-
ENDIAN = "little"
|
42
|
-
else
|
43
|
-
ENDIAN = "big"
|
44
|
-
end
|
45
|
-
|
46
|
-
FMT_VAX = {
|
47
|
-
"f" => "e", "F" => "e", "e" => "e", "g" => "g",
|
48
|
-
"d" => "E", "D" => "E", "E" => "E", "G" => "G",
|
49
|
-
"s" => "v", "v" => "v", "n" => "n",
|
50
|
-
"l" => "V", "V" => "V", "N" => "N",
|
51
|
-
"a" => "a"
|
52
|
-
}
|
53
|
-
|
54
|
-
FMT_NET = {
|
55
|
-
"f" => "g", "F" => "g", "e" => "e", "g" => "g",
|
56
|
-
"d" => "G", "D" => "G", "E" => "E", "G" => "G",
|
57
|
-
"s" => "n", "v" => "v", "n" => "n",
|
58
|
-
"l" => "N", "V" => "V", "N" => "N",
|
59
|
-
"a" => "a"
|
60
|
-
}
|
61
|
-
|
62
|
-
def self.open (file, mode="r", opt={:endian=>nil})
|
63
|
-
io = Kernel::open(file, mode)
|
64
|
-
if mode =~ /r/
|
65
|
-
fs = FortranSequentialReader.new(io, opt)
|
66
|
-
else
|
67
|
-
fs = FortranSequentialWriter.new(io, opt)
|
68
|
-
end
|
69
|
-
if block_given?
|
70
|
-
begin
|
71
|
-
yield(fs)
|
72
|
-
ensure
|
73
|
-
fs.close
|
74
|
-
end
|
75
|
-
else
|
76
|
-
return fs
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def get_pack_fmt (endian)
|
81
|
-
case endian
|
82
|
-
when "big"
|
83
|
-
return FMT_NET
|
84
|
-
when "little"
|
85
|
-
return FMT_VAX
|
86
|
-
else
|
87
|
-
raise "unknown endian '#{endian}'"
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
class Record
|
92
|
-
|
93
|
-
def initialize (data="", endian="little", fmt=nil)
|
94
|
-
@io = StringIO.new(data)
|
95
|
-
@fmt = fmt
|
96
|
-
@endian = endian
|
97
|
-
end
|
98
|
-
|
99
|
-
def to_s
|
100
|
-
return @io.string
|
101
|
-
end
|
102
|
-
|
103
|
-
def empty?
|
104
|
-
return @io.eof?
|
105
|
-
end
|
106
|
-
|
107
|
-
def rest?
|
108
|
-
return (not @io.eof?)
|
109
|
-
end
|
110
|
-
|
111
|
-
def read (*fmts)
|
112
|
-
out = []
|
113
|
-
while not fmts.empty?
|
114
|
-
case fmt = fmts.shift
|
115
|
-
when String
|
116
|
-
list = []
|
117
|
-
specs = fmt.scan(/(?:\d+|)(?:a\[\d+\]|\w)/)
|
118
|
-
while not specs.empty?
|
119
|
-
case specs.shift
|
120
|
-
when /(\d+)?a\[(\d+)\]/
|
121
|
-
($1||1).to_i.times do
|
122
|
-
list.push(*@io.read($2.to_i).unpack("a#{$2}"))
|
123
|
-
end
|
124
|
-
when /(\d+)?a/
|
125
|
-
($1||1).to_i.times do
|
126
|
-
list.push(*@io.read(1).unpack("a"))
|
127
|
-
end
|
128
|
-
when /(\d+)?([dDEG])/
|
129
|
-
($1||1).to_i.times do
|
130
|
-
list.push(*@io.read(8).unpack(@fmt[$2]))
|
131
|
-
end
|
132
|
-
when /(\d+)?([lNVefFg])/
|
133
|
-
($1||1).to_i.times do
|
134
|
-
list.push(*@io.read(4).unpack(@fmt[$2]))
|
135
|
-
end
|
136
|
-
when /(\d+)?([nsv])/
|
137
|
-
($1||1).to_i.times do
|
138
|
-
list.push(*@io.read(2).unpack(@fmt[$2]))
|
139
|
-
end
|
140
|
-
else
|
141
|
-
raise "invalid format for FortranSequential::Record#read"
|
142
|
-
end
|
143
|
-
end
|
144
|
-
if list.size == 1
|
145
|
-
out.push(list.first)
|
146
|
-
else
|
147
|
-
out.push(list)
|
148
|
-
end
|
149
|
-
when Integer
|
150
|
-
n, tmpl = fmt, fmts.shift
|
151
|
-
n.times do
|
152
|
-
out.push(tmpl.template.load_binary(@io))
|
153
|
-
end
|
154
|
-
when CArray
|
155
|
-
tmpl = fmt
|
156
|
-
if ENDIAN == @endian
|
157
|
-
out.push(tmpl.template.load_binary(@io))
|
158
|
-
else
|
159
|
-
out.push(tmpl.template.load_binary(@io).swap_bytes!)
|
160
|
-
end
|
161
|
-
when CA::Struct
|
162
|
-
if ENDIAN == @endian
|
163
|
-
out.push(CScalar.new(fmt.class).load_binary(@io)[0])
|
164
|
-
else
|
165
|
-
out.push(CScalar.new(fmt.class).load_binary(@io).swap_bytes![0])
|
166
|
-
end
|
167
|
-
when Class
|
168
|
-
if fmt < CA::Struct
|
169
|
-
if ENDIAN == @endian
|
170
|
-
out.push(CScalar.new(fmt).load_binary(@io)[0])
|
171
|
-
else
|
172
|
-
out.push(CScalar.new(fmt).load_binary(@io).swap_bytes![0])
|
173
|
-
end
|
174
|
-
else
|
175
|
-
raise "invlaid argument (format string or CArray)"
|
176
|
-
end
|
177
|
-
else
|
178
|
-
raise "invlaid argument (format string or CArray)"
|
179
|
-
end
|
180
|
-
end
|
181
|
-
if out.size == 1
|
182
|
-
return out.first
|
183
|
-
else
|
184
|
-
return out
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def write (*fmts)
|
189
|
-
while fmt = fmts.shift
|
190
|
-
if fmt.is_a?(String)
|
191
|
-
argv = fmts.shift
|
192
|
-
unless argv.is_a?(Array)
|
193
|
-
raise "argv should be array"
|
194
|
-
end
|
195
|
-
argv = argv.clone
|
196
|
-
end
|
197
|
-
case fmt
|
198
|
-
when String
|
199
|
-
specs = fmt.scan(/(?:\d+|)(?:a\[\d+\]|\w)/)
|
200
|
-
while not specs.empty?
|
201
|
-
case specs.shift
|
202
|
-
when /(\d+)?a\[(\d+)\]/
|
203
|
-
($1||1).to_i.times do
|
204
|
-
@io.write [argv.shift].pack("a#{$2}")
|
205
|
-
end
|
206
|
-
when /(\d+)?([adDEGefFglNVnsv])/
|
207
|
-
($1||1).to_i.times do
|
208
|
-
@io.write [argv.shift].pack(@fmt[$2])
|
209
|
-
end
|
210
|
-
else
|
211
|
-
raise "invalid format for FortranSequential::Record#write"
|
212
|
-
end
|
213
|
-
end
|
214
|
-
when CArray
|
215
|
-
if ENDIAN == @endian
|
216
|
-
fmt.dump_binary(@io)
|
217
|
-
else
|
218
|
-
fmt.swap_bytes.dump_binary(@io)
|
219
|
-
end
|
220
|
-
when CA::Struct
|
221
|
-
if RUBY_VERSION.to_f >= 1.9
|
222
|
-
if ENDIAN == @endian
|
223
|
-
@io.write fmt.encode.force_encoding("ASCII-8BIT")
|
224
|
-
else
|
225
|
-
@io.write fmt.swap_bytes.encode.force_encoding("ASCII-8BIT")
|
226
|
-
end
|
227
|
-
else
|
228
|
-
if ENDIAN == @endian
|
229
|
-
@io.write fmt.encode
|
230
|
-
else
|
231
|
-
@io.write fmt.swap_bytes.encode
|
232
|
-
end
|
233
|
-
end
|
234
|
-
else
|
235
|
-
raise "invlaid argument (format string or CArray)"
|
236
|
-
end
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
end
|
241
|
-
|
242
|
-
def eof?
|
243
|
-
return @io.eof?
|
244
|
-
end
|
245
|
-
|
246
|
-
end
|
247
|
-
|
248
|
-
class FortranSequentialReader < FortranSequential
|
249
|
-
|
250
|
-
def initialize (io, opt={:endian=>nil})
|
251
|
-
@io = io
|
252
|
-
@endian = opt[:endian] || ENDIAN
|
253
|
-
@fmt = get_pack_fmt(@endian)
|
254
|
-
end
|
255
|
-
|
256
|
-
def record (n=nil)
|
257
|
-
if n
|
258
|
-
@io.rewind
|
259
|
-
skip(n)
|
260
|
-
end
|
261
|
-
data = read
|
262
|
-
if data
|
263
|
-
rec = FortranSequential::Record.new(data, @endian, @fmt)
|
264
|
-
if block_given?
|
265
|
-
return yield(rec)
|
266
|
-
else
|
267
|
-
return rec
|
268
|
-
end
|
269
|
-
else
|
270
|
-
return nil
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
|
-
def skip (n=1)
|
275
|
-
n.times do
|
276
|
-
unless @io.eof?
|
277
|
-
length = @io.read(4).unpack(@fmt["l"]).first
|
278
|
-
@io.pos += length
|
279
|
-
if length != @io.read(4).unpack(@fmt["l"]).first
|
280
|
-
raise "invalid record length (should be #{length})"
|
281
|
-
end
|
282
|
-
end
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
def read (*dummy)
|
287
|
-
if @io.eof?
|
288
|
-
return nil
|
289
|
-
else
|
290
|
-
length = @io.read(4).unpack(@fmt["l"]).first
|
291
|
-
data = @io.read(length)
|
292
|
-
if data.length != length
|
293
|
-
raise "record too short (record length should be #{length})"
|
294
|
-
end
|
295
|
-
if length != @io.read(4).unpack(@fmt["l"]).first
|
296
|
-
raise "mismatched record length (should be #{length})"
|
297
|
-
end
|
298
|
-
return data
|
299
|
-
end
|
300
|
-
end
|
301
|
-
|
302
|
-
def close
|
303
|
-
@io.close
|
304
|
-
end
|
305
|
-
|
306
|
-
end
|
307
|
-
|
308
|
-
class FortranSequentialWriter < FortranSequential
|
309
|
-
|
310
|
-
def initialize (io, opt={:endian=>nil})
|
311
|
-
@io = io
|
312
|
-
@endian = opt[:endian] || ENDIAN
|
313
|
-
@fmt = get_pack_fmt(@endian)
|
314
|
-
end
|
315
|
-
|
316
|
-
def record
|
317
|
-
rec = FortranSequential::Record.new("", @endian, @fmt)
|
318
|
-
if block_given?
|
319
|
-
return yield(rec)
|
320
|
-
else
|
321
|
-
return rec
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
def write (data)
|
326
|
-
if data.respond_to?(:to_s)
|
327
|
-
data = data.to_s
|
328
|
-
end
|
329
|
-
if RUBY_VERSION.to_f >= 1.9
|
330
|
-
data = data.force_encoding("ASCII-8BIT")
|
331
|
-
end
|
332
|
-
@io.write [data.length].pack(@fmt["l"])
|
333
|
-
@io.write data
|
334
|
-
@io.write [data.length].pack(@fmt["l"])
|
335
|
-
end
|
336
|
-
|
337
|
-
def close
|
338
|
-
@io.close
|
339
|
-
end
|
340
|
-
|
341
|
-
end
|
342
|
-
|
343
|
-
def fortran_sequential_open (file, mode="r", opt={:endian=>nil}, &block)
|
344
|
-
return FortranSequential.open(file, mode, opt, &block)
|
345
|
-
end
|