Skip to content
Open
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
24 changes: 13 additions & 11 deletions src/netcdf.nim
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
import netcdf/dimensions
export dimensions

import netcdf/error_handler

import netcdf/netcdf_bindings
export netcdf_bindings

type
NetcdfError* = object of CatchableError

NcId* = distinct cint
import netcdf/shared_types
export shared_types

type
OpenMode* = enum
omNoWrite = NC_NOWRITE # read-only
omWrite = NC_WRITE
omShare = NC_SHARE
omWriteShare = NC_WRITE or NC_SHARE

template handleError(body: untyped) =
let retval: cint = body
if retval != 0:
raise newException(NetcdfError, "Error " & $retval & ": " & $retval.strerror & ". Call: " & body.astToStr)

proc `$`*(ncid: NcId): string = $ncid.int

proc ncOpen*(path: string, mode = omNoWrite): NCid =
handleError open(path, mode.cint, result.cint)

proc close*(ncid: NCid) =
handleError close(ncid.cint)

proc inq*(ncid: NCid): tuple[ndims, nvars, natts, unlimdimid: int] =
var ndims, nvars, natts, unlimdimid: cint
handleError inq(ncid.cint, ndims, nvars, natts, unlimdimid)
(ndims.int, nvars.int, natts.int, unlimdimid.int)
31 changes: 31 additions & 0 deletions src/netcdf/dimensions.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import netcdf/[error_handler, netcdf_bindings, shared_types]

# Wrappers with Nim types for the C bindings

proc inqNdims*(ncid: NCId): int =
var ndims: cint
handleError inqNdims(ncid.cint, ndims)
ndims.int

proc inqDimname*(ncid: NCId, dimid: DimId): string =
result = newString(NC_MAX_NAME + 1)
handleError inqDimname(ncid.cint, dimid.cint, result.cstring)
result.setLen(result.cstring.len)

proc inqDimid*(ncid: NCid, name: string): DimId =
handleError inqDimid(ncid.cint, name, result.cint)

proc inqDimlen*(ncid: NCId, dimid: DimId): int =
var len: csize_t
handleError inqDimlen(ncid.cint, dimid.cint, len)
len.int


# Additional convenience procs

proc inqDimnames*(ncid: NCId): seq[string] =
for dimid in 0 ..< inqNdims(ncid):
result.add inqDimname(ncid, dimid.DimId)

proc inqDimlen*(ncid: NCId, name: string): int =
inqDimlen(ncid, inqDimid(ncid, name))
5 changes: 5 additions & 0 deletions src/netcdf/error_handler.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
template handleError*(body: untyped) =
let retval: cint = body
if retval != 0:
raise newException(NetcdfError, "Error " & $retval & ": " &
$retval.strerror & ". Call: " & body.astToStr)
10 changes: 5 additions & 5 deletions src/netcdf/netcdf_bindings.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1062,9 +1062,9 @@ proc enddef*(ncid: cint): cint {.importc: "nc_enddef", dynlib: libnetcdf.}
proc sync*(ncid: cint): cint {.importc: "nc_sync", dynlib: libnetcdf.}
proc abort*(ncid: cint): cint {.importc: "nc_abort", dynlib: libnetcdf.}
proc close*(ncid: cint): cint {.importc: "nc_close", dynlib: libnetcdf.}
proc inq*(ncid: cint; ndimsp: ptr cint; nvarsp: ptr cint; nattsp: ptr cint;
unlimdimidp: ptr cint): cint {.importc: "nc_inq", dynlib: libnetcdf.}
proc inq_ndims*(ncid: cint; ndimsp: ptr cint): cint {.importc: "nc_inq_ndims",
proc inq*(ncid: cint; ndimsp, nvarsp, nattsp,
unlimdimidp: var cint): cint {.importc: "nc_inq", dynlib: libnetcdf.}
proc inq_ndims*(ncid: cint; ndimsp: var cint): cint {.importc: "nc_inq_ndims",
dynlib: libnetcdf.}
proc inq_nvars*(ncid: cint; nvarsp: ptr cint): cint {.importc: "nc_inq_nvars",
dynlib: libnetcdf.}
Expand All @@ -1088,13 +1088,13 @@ proc inq_format_extended*(ncid: cint; formatp: ptr cint; modep: ptr cint): cint

proc def_dim*(ncid: cint; name: cstring; len: csize_t; idp: ptr cint): cint {.
importc: "nc_def_dim", dynlib: libnetcdf.}
proc inq_dimid*(ncid: cint; name: cstring; idp: ptr cint): cint {.
proc inq_dimid*(ncid: cint; name: cstring; idp: var cint): cint {.
importc: "nc_inq_dimid", dynlib: libnetcdf.}
proc inq_dim*(ncid: cint; dimid: cint; name: cstring; lenp: ptr csize_t): cint {.
importc: "nc_inq_dim", dynlib: libnetcdf.}
proc inq_dimname*(ncid: cint; dimid: cint; name: cstring): cint {.
importc: "nc_inq_dimname", dynlib: libnetcdf.}
proc inq_dimlen*(ncid: cint; dimid: cint; lenp: ptr csize_t): cint {.
proc inq_dimlen*(ncid: cint; dimid: cint; lenp: var csize_t): cint {.
importc: "nc_inq_dimlen", dynlib: libnetcdf.}
proc rename_dim*(ncid: cint; dimid: cint; name: cstring): cint {.
importc: "nc_rename_dim", dynlib: libnetcdf.}
Expand Down
10 changes: 10 additions & 0 deletions src/netcdf/shared_types.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
type
NetcdfError* = object of CatchableError

NcId* = distinct cint

DimId* = distinct cint

proc `$`*(ncid: NcId): string = $ncid.int

proc `$`*(dimid: DimId): string = $dimid.int