Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/dataset.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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
Expand Down
3 changes: 0 additions & 3 deletions src/enums.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 2 additions & 4 deletions src/loading/variable.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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

Expand Down
15 changes: 1 addition & 14 deletions src/parsing.jl
Original file line number Diff line number Diff line change
@@ -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)
Expand All @@ -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)))
Expand Down Expand Up @@ -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)

Expand Down
18 changes: 11 additions & 7 deletions src/variable.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down