diff --git a/src/dataset.jl b/src/dataset.jl index 447656b..4e344d2 100644 --- a/src/dataset.jl +++ b/src/dataset.jl @@ -38,6 +38,8 @@ function CDFDataset(filename) end end +is_big_endian_encoding(cdf::CDFDataset) = is_big_endian_encoding(cdf.cdr.encoding) + is_compressed(magic_numbers::UInt32) = magic_numbers != 0x0000FFFF majority(cdf::CDFDataset) = majority(cdf.cdr) @@ -119,7 +121,9 @@ function Base.show(io::IO, m::MIME"text/plain", cdf::CDFDataset) println(io, "variables:") for key in keys(cdf) var = cdf[key] - print(io, " $key : ", size(var), " ", DataType(var.vdr.data_type)) + print(io, " ", key, " : ", size(var), " ") + printstyled(io, variable_type(var); bold = true) + print(io, " ", DataType(var.vdr.data_type)) !isempty(var) && print(io, " [", var[1], " … ", var[end], "]") println(io) end diff --git a/src/enums.jl b/src/enums.jl index 70ed7cf..a597152 100644 --- a/src/enums.jl +++ b/src/enums.jl @@ -40,9 +40,6 @@ end CDF_UCHAR = 52 end -DataType(x::DataType) = x -DataType(x::UInt32) = DataType(Int32(x)) - Base.:(==)(x::RecordType, y::T) where {T <: Integer} = T(x) == y Base.:(==)(x::T, y::RecordType) where {T <: Integer} = x == T(y) Base.:(==)(x::DataType, y::T) where {T <: Integer} = T(x) == y diff --git a/src/loading/variable.jl b/src/loading/variable.jl index 2d0da9a..ecdd2c7 100644 --- a/src/loading/variable.jl +++ b/src/loading/variable.jl @@ -43,10 +43,8 @@ function variable(cdf::CDFDataset, name) T = julia_type(vdr.data_type, vdr.num_elems) dims = (record_sizes(vdr)..., vdr.max_rec + 1) N = vdr isa VDR ? vdr.num_dims + 1 : length(dims) - byte_swap = is_big_endian_encoding(cdf.cdr.encoding) - return CDFVariable{T, N, typeof(vdr), typeof(cdf)}( - name, vdr, cdf, dims, byte_swap + name, vdr, cdf, dims ) end @@ -132,7 +130,7 @@ function DiskArrays.readblock!(var::CDFVariable{T, N}, dest::AbstractArray{T}, r end end end - var.byte_swap && _btye_swap!(dest) + is_big_endian_encoding(var) && _btye_swap!(dest) return dest end diff --git a/src/parsing.jl b/src/parsing.jl index ac3dc8d..b250251 100644 --- a/src/parsing.jl +++ b/src/parsing.jl @@ -1,9 +1,6 @@ # CDF parsing utilities # Low-level binary reading and record parsing functions -@inline read_be(io::IO, T) = ntoh(read(io, T)) -@inline read_be(io::IO, n, T) = ntuple(i -> read_be(io, T), n) - # Buffer-based reading functions for zero-copy access # https://github.com/JuliaLang/julia/issues/31305 @inline function read_be(v::Vector{UInt8}, i, T) @@ -13,7 +10,7 @@ end end -@inline read_be(v::Vector{UInt8}, i, ::Type{RInt32}) = RInt32() +@inline read_be(::Vector{UInt8}, i, ::Type{RInt32}) = RInt32() @inline function read_be(p::Ptr{T}, i) where {T} return ntoh(unsafe_load(p + (i - 1) * sizeof(T))) @@ -143,16 +140,6 @@ function get_offsets!(offsets, buffer::Vector{UInt8}, pos, FieldSizeType) end get_offsets(args...) = get_offsets!(Int[], args...) - -# Big-endian readers (CDF uses big-endian for most fields) -""" - read_uint32_be(io::IO) - -Read a 32-bit unsigned integer in big-endian byte order. -CDF format uses big-endian for record fields. -""" -read_uint32_be(io::IO) = ntoh(read(io, UInt32)) - """ is_cdf_v3(magic_bytes) diff --git a/src/variable.jl b/src/variable.jl index e4dfedf..46bc0b6 100644 --- a/src/variable.jl +++ b/src/variable.jl @@ -13,12 +13,12 @@ struct CDFVariable{T, N, V, P} <: AbstractVariable{T, N} vdr::V parentdataset::P dims::NTuple{N, Int} - byte_swap::Bool end Base.size(var::CDFVariable) = var.dims @inline majority(var::CDFVariable) = majority(var.parentdataset) +@inline is_big_endian_encoding(var::CDFVariable) = is_big_endian_encoding(var.parentdataset) function dst_src_ranges(first, last, entry) overlap_first = max(first, entry.first) @@ -87,10 +87,14 @@ end attrib(var::CDFVariable, name::String) = vattrib(var.parentdataset, var.vdr.num, name) attrib(var::CDFVariable) = vattrib(var.parentdataset, var.vdr.num) -function CPR(var::CDFVariable) - vdr = var.vdr - cdf = var.parentdataset - return CPR(parent(cdf), vdr.cpr_or_spr_offset, recordsize_type(cdf)) -end - is_record_varying(v::CDFVariable) = is_record_varying(v.vdr) +variable_type(v::CDFVariable) = get(v.attrib, "VAR_TYPE", "unknown") + +function Base.show(io::IO, m::MIME"text/plain", var::CDFVariable) + summary(io, var) + println(io) + println(io, var.vdr) + print(io, "attributes: ") + show(io, m, var.attrib) + return +end diff --git a/test/runtests.jl b/test/runtests.jl index 8c8a9fd..9848995 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -29,6 +29,7 @@ end @test first(ds) == ds["var"] @test occursin("Version: 3.9.0", string(ds)) display(ds) + display(ds["var"]) end @testset "Compressed cdf file (gzip)" begin