Skip to content

Commit df66fc3

Browse files
authored
feat: enhance CDF variable display and refactor byte encoding (#28)
- Moved byte encoding logic to dataset level with new is_big_endian_encoding method - Simplified CDFVariable struct by removing redundant byte_swap field - Added dedicated show method for CDFVariable with detailed attribute display - Removed unused DataType conversion functions and CPR helper - Cleaned up variable loading code by using dataset-level encoding check
1 parent b00ddad commit df66fc3

6 files changed

Lines changed: 20 additions & 29 deletions

File tree

src/dataset.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ function CDFDataset(filename)
3838
end
3939
end
4040

41+
is_big_endian_encoding(cdf::CDFDataset) = is_big_endian_encoding(cdf.cdr.encoding)
42+
4143
is_compressed(magic_numbers::UInt32) = magic_numbers != 0x0000FFFF
4244
majority(cdf::CDFDataset) = majority(cdf.cdr)
4345

@@ -119,7 +121,9 @@ function Base.show(io::IO, m::MIME"text/plain", cdf::CDFDataset)
119121
println(io, "variables:")
120122
for key in keys(cdf)
121123
var = cdf[key]
122-
print(io, " $key : ", size(var), " ", DataType(var.vdr.data_type))
124+
print(io, " ", key, " : ", size(var), " ")
125+
printstyled(io, variable_type(var); bold = true)
126+
print(io, " ", DataType(var.vdr.data_type))
123127
!isempty(var) && print(io, " [", var[1], "", var[end], "]")
124128
println(io)
125129
end

src/enums.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ end
4040
CDF_UCHAR = 52
4141
end
4242

43-
DataType(x::DataType) = x
44-
DataType(x::UInt32) = DataType(Int32(x))
45-
4643
Base.:(==)(x::RecordType, y::T) where {T <: Integer} = T(x) == y
4744
Base.:(==)(x::T, y::RecordType) where {T <: Integer} = x == T(y)
4845
Base.:(==)(x::DataType, y::T) where {T <: Integer} = T(x) == y

src/loading/variable.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,8 @@ function variable(cdf::CDFDataset, name)
4343
T = julia_type(vdr.data_type, vdr.num_elems)
4444
dims = (record_sizes(vdr)..., vdr.max_rec + 1)
4545
N = vdr isa VDR ? vdr.num_dims + 1 : length(dims)
46-
byte_swap = is_big_endian_encoding(cdf.cdr.encoding)
47-
4846
return CDFVariable{T, N, typeof(vdr), typeof(cdf)}(
49-
name, vdr, cdf, dims, byte_swap
47+
name, vdr, cdf, dims
5048
)
5149
end
5250

@@ -132,7 +130,7 @@ function DiskArrays.readblock!(var::CDFVariable{T, N}, dest::AbstractArray{T}, r
132130
end
133131
end
134132
end
135-
var.byte_swap && _btye_swap!(dest)
133+
is_big_endian_encoding(var) && _btye_swap!(dest)
136134
return dest
137135
end
138136

src/parsing.jl

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
# CDF parsing utilities
22
# Low-level binary reading and record parsing functions
33

4-
@inline read_be(io::IO, T) = ntoh(read(io, T))
5-
@inline read_be(io::IO, n, T) = ntuple(i -> read_be(io, T), n)
6-
74
# Buffer-based reading functions for zero-copy access
85
# https://github.com/JuliaLang/julia/issues/31305
96
@inline function read_be(v::Vector{UInt8}, i, T)
@@ -13,7 +10,7 @@
1310
end
1411
end
1512

16-
@inline read_be(v::Vector{UInt8}, i, ::Type{RInt32}) = RInt32()
13+
@inline read_be(::Vector{UInt8}, i, ::Type{RInt32}) = RInt32()
1714

1815
@inline function read_be(p::Ptr{T}, i) where {T}
1916
return ntoh(unsafe_load(p + (i - 1) * sizeof(T)))
@@ -143,16 +140,6 @@ function get_offsets!(offsets, buffer::Vector{UInt8}, pos, FieldSizeType)
143140
end
144141
get_offsets(args...) = get_offsets!(Int[], args...)
145142

146-
147-
# Big-endian readers (CDF uses big-endian for most fields)
148-
"""
149-
read_uint32_be(io::IO)
150-
151-
Read a 32-bit unsigned integer in big-endian byte order.
152-
CDF format uses big-endian for record fields.
153-
"""
154-
read_uint32_be(io::IO) = ntoh(read(io, UInt32))
155-
156143
"""
157144
is_cdf_v3(magic_bytes)
158145

src/variable.jl

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ struct CDFVariable{T, N, V, P} <: AbstractVariable{T, N}
1313
vdr::V
1414
parentdataset::P
1515
dims::NTuple{N, Int}
16-
byte_swap::Bool
1716
end
1817

1918
Base.size(var::CDFVariable) = var.dims
2019

2120
@inline majority(var::CDFVariable) = majority(var.parentdataset)
21+
@inline is_big_endian_encoding(var::CDFVariable) = is_big_endian_encoding(var.parentdataset)
2222

2323
function dst_src_ranges(first, last, entry)
2424
overlap_first = max(first, entry.first)
@@ -87,10 +87,14 @@ end
8787
attrib(var::CDFVariable, name::String) = vattrib(var.parentdataset, var.vdr.num, name)
8888
attrib(var::CDFVariable) = vattrib(var.parentdataset, var.vdr.num)
8989

90-
function CPR(var::CDFVariable)
91-
vdr = var.vdr
92-
cdf = var.parentdataset
93-
return CPR(parent(cdf), vdr.cpr_or_spr_offset, recordsize_type(cdf))
94-
end
95-
9690
is_record_varying(v::CDFVariable) = is_record_varying(v.vdr)
91+
variable_type(v::CDFVariable) = get(v.attrib, "VAR_TYPE", "unknown")
92+
93+
function Base.show(io::IO, m::MIME"text/plain", var::CDFVariable)
94+
summary(io, var)
95+
println(io)
96+
println(io, var.vdr)
97+
print(io, "attributes: ")
98+
show(io, m, var.attrib)
99+
return
100+
end

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ end
2929
@test first(ds) == ds["var"]
3030
@test occursin("Version: 3.9.0", string(ds))
3131
display(ds)
32+
display(ds["var"])
3233
end
3334

3435
@testset "Compressed cdf file (gzip)" begin

0 commit comments

Comments
 (0)