hnetcdf-0.4.0.0: Data/NetCDF/Raw/Attributes.chs
{-# LANGUAGE ForeignFunctionInterface #-}
-- | Raw bindings for attribute handling functions.
module Data.NetCDF.Raw.Attributes where
import Data.Char
import Data.Word
import Data.NetCDF.Raw.Utils
#include <netcdf.h>
-- nc_put_att_text has to be treated seperately since it has a
-- different calling sequence to all the other
-- nc_put_att_... functions.
-- int nc_put_att_text(int ncid, int varid, const char *name,
-- size_t len, const char *op);
nc_put_att_text :: Int -> Int -> String -> Int -> String -> IO Int
nc_put_att_text nc var name _ v = do
let ncid = fromIntegral nc
varid = fromIntegral var
ncsize = fromIntegral $ length v
let tv = map convChar v
withCString name $ \namep -> do
withCString tv $ \vp -> do
res <- nc_put_att_text'_ ncid varid namep ncsize vp
return $ fromIntegral res
where convChar c
| isAscii c = c
| otherwise = ' '
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_text"
nc_put_att_text'_ :: CInt -> CInt -> CString -> CULong
-> Ptr CChar -> IO CInt
nc_put_att :: Storable b =>
(CInt -> CInt -> CString -> CInt -> CULong -> Ptr b -> IO CInt)
-> (a -> b) -> Int -> Int -> String -> Int -> [a] -> IO Int
nc_put_att cfn conv nc var name xtype v = do
let ncid = fromIntegral nc
varid = fromIntegral var
ncxtype = fromIntegral xtype
ncsize = fromIntegral $ length v
let tv = map conv v
withCString name $ \namep -> do
withArray tv $ \vp -> do
res <- cfn ncid varid namep ncxtype ncsize vp
return $ fromIntegral res
-- int nc_put_att_uchar(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const unsigned char *op);
nc_put_att_uchar :: Int -> Int -> String -> Int -> [Word8] -> IO Int
nc_put_att_uchar = nc_put_att nc_put_att_uchar'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_uchar"
nc_put_att_uchar'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CUChar -> IO CInt
-- int nc_put_att_schar(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const signed char *op);
nc_put_att_schar :: Int -> Int -> String -> Int -> [Word8] -> IO Int
nc_put_att_schar = nc_put_att nc_put_att_schar'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_schar"
nc_put_att_schar'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CChar -> IO CInt
-- int nc_put_att_short(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const short *op);
nc_put_att_short :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_short = nc_put_att nc_put_att_short'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_short"
nc_put_att_short'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CShort -> IO CInt
-- int nc_put_att_int(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const int *op);
nc_put_att_int :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_int = nc_put_att nc_put_att_int'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_int"
nc_put_att_int'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CInt -> IO CInt
-- int nc_put_att_long(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const long *op);
nc_put_att_long :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_long = nc_put_att nc_put_att_long'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_long"
nc_put_att_long'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CLong -> IO CInt
-- int nc_put_att_float(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const float *op);
nc_put_att_float :: Int -> Int -> String -> Int -> [Float] -> IO Int
nc_put_att_float = nc_put_att nc_put_att_float'_ realToFrac
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_float"
nc_put_att_float'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CFloat -> IO CInt
-- int nc_put_att_double(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const double *op);
nc_put_att_double :: Int -> Int -> String -> Int -> [Double] -> IO Int
nc_put_att_double = nc_put_att nc_put_att_double'_ realToFrac
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_double"
nc_put_att_double'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CDouble -> IO CInt
-- int nc_put_att_ushort(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const unsigned short *op);
nc_put_att_ushort :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_ushort = nc_put_att nc_put_att_ushort'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_ushort"
nc_put_att_ushort'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CUShort -> IO CInt
-- int nc_put_att_uint(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const unsigned int *op);
nc_put_att_uint :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_uint = nc_put_att nc_put_att_uint'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_uint"
nc_put_att_uint'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CUInt -> IO CInt
-- int nc_put_att_longlong(int ncid, int varid, const char *name, nc_type xtype,
-- size_t len, const long long *op);
nc_put_att_longlong :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_longlong = nc_put_att nc_put_att_longlong'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_longlong"
nc_put_att_longlong'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CLLong -> IO CInt
-- int nc_put_att_ulonglong(int ncid, int varid, const char *name,
-- nc_type xtype, size_t len,
-- const unsigned long long *op);
nc_put_att_ulonglong :: Int -> Int -> String -> Int -> [Int] -> IO Int
nc_put_att_ulonglong = nc_put_att nc_put_att_ulonglong'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_put_att_ulonglong"
nc_put_att_ulonglong'_ :: CInt -> CInt -> CString -> CInt -> CULong
-> Ptr CULLong -> IO CInt
-- int nc_inq_attname(int ncid, int varid, int attnum, char *name);
{#fun nc_inq_attname { `Int', `Int', `Int',
allocaName- `String' peekCString* } -> `Int' #}
-- int nc_inq_att(int ncid, int varid, const char *name,
-- nc_type *xtypep, size_t *lenp);
{#fun nc_inq_att { `Int', `Int', `String', alloca- `Int' peekIntConv*,
alloca- `Int' peekIntConv* } -> `Int' #}
-- int nc_inq_attid(int ncid, int varid, const char *name, int *idp);
{#fun nc_inq_attid { `Int', `Int', `String',
alloca- `Int' peekIntConv* } -> `Int' #}
-- int nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep);
{#fun nc_inq_atttype { `Int', `Int', `String',
alloca- `Int' peekIntConv* } -> `Int' #}
-- int nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp);
{#fun nc_inq_attlen { `Int', `Int', `String',
alloca- `Int' peekIntConv* } -> `Int' #}
-- int nc_copy_att(int ncid_in, int varid_in, const char *name,
-- int ncid_out, int varid_out);
{#fun nc_copy_att { `Int', `Int', `String', `Int', `Int' } -> `Int' #}
-- int nc_rename_att(int ncid, int varid, const char *name,
-- const char *newname);
{#fun nc_rename_att { `Int', `Int', `String', `String' } -> `Int' #}
-- int nc_del_att(int ncid, int varid, const char *name);
{#fun nc_del_att { `Int', `Int', `String' } -> `Int' #}
nc_get_att :: Storable a =>
(CInt -> CInt -> CString -> Ptr a -> IO CInt)
-> (a -> b) -> Int -> Int -> String -> Int -> IO (Int, [b])
nc_get_att cfn conv nc var name cnt = do
let ncid = fromIntegral nc
varid = fromIntegral var
withCString name $ \namep -> do
allocaArray cnt $ \vp -> do
res <- cfn ncid varid namep vp
vs <- peekArray cnt vp
return $ (fromIntegral res, map conv vs)
-- int nc_get_att_text(int ncid, int varid, const char *name, char *ip);
nc_get_att_text :: Int -> Int -> String -> Int -> IO (Int, String)
nc_get_att_text ncid var name ip = do
(s, str) <- nc_get_att nc_get_att_text'_ (chr . fromIntegral) ncid var name ip
return (s, takeWhile (/='\NUL') str)
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_text"
nc_get_att_text'_ :: CInt -> CInt -> CString -> Ptr CChar -> IO CInt
-- int nc_get_att_uchar(int ncid, int varid, const char *name,
-- unsigned char *ip);
nc_get_att_uchar :: Int -> Int -> String -> Int -> IO (Int, [CChar])
nc_get_att_uchar = nc_get_att nc_get_att_uchar'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_uchar"
nc_get_att_uchar'_ :: CInt -> CInt -> CString -> Ptr CUChar -> IO CInt
-- int nc_get_att_schar(int ncid, int varid, const char *name, signed char *ip);
nc_get_att_schar :: Int -> Int -> String -> Int -> IO (Int, [CSChar])
nc_get_att_schar = nc_get_att nc_get_att_schar'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_schar"
nc_get_att_schar'_ :: CInt -> CInt -> CString -> Ptr CChar -> IO CInt
-- int nc_get_att_short(int ncid, int varid, const char *name, short *ip);
nc_get_att_short :: Int -> Int -> String -> Int -> IO (Int, [CShort])
nc_get_att_short = nc_get_att nc_get_att_short'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_short"
nc_get_att_short'_ :: CInt -> CInt -> CString -> Ptr CShort -> IO CInt
-- int nc_get_att_int(int ncid, int varid, const char *name, int *ip);
nc_get_att_int :: Int -> Int -> String -> Int -> IO (Int, [CInt])
nc_get_att_int = nc_get_att nc_get_att_int'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_int"
nc_get_att_int'_ :: CInt -> CInt -> CString -> Ptr CInt -> IO CInt
-- int nc_get_att_long(int ncid, int varid, const char *name, long *ip);
nc_get_att_long :: Int -> Int -> String -> Int -> IO (Int, [CLong])
nc_get_att_long = nc_get_att nc_get_att_long'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_long"
nc_get_att_long'_ :: CInt -> CInt -> CString -> Ptr CLong -> IO CInt
-- int nc_get_att_float(int ncid, int varid, const char *name, float *ip);
nc_get_att_float :: Int -> Int -> String -> Int -> IO (Int, [CFloat])
nc_get_att_float = nc_get_att nc_get_att_float'_ realToFrac
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_float"
nc_get_att_float'_ :: CInt -> CInt -> CString -> Ptr CFloat -> IO CInt
-- int nc_get_att_double(int ncid, int varid, const char *name, double *ip);
nc_get_att_double :: Int -> Int -> String -> Int -> IO (Int, [CDouble])
nc_get_att_double = nc_get_att nc_get_att_double'_ realToFrac
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_double"
nc_get_att_double'_ :: CInt -> CInt -> CString -> Ptr CDouble -> IO CInt
-- int nc_get_att_ushort(int ncid, int varid, const char *name,
-- unsigned short *ip);
nc_get_att_ushort :: Int -> Int -> String -> Int -> IO (Int, [CUShort])
nc_get_att_ushort = nc_get_att nc_get_att_ushort'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_ushort"
nc_get_att_ushort'_ :: CInt -> CInt -> CString -> Ptr CUShort -> IO CInt
-- int nc_get_att_uint(int ncid, int varid, const char *name, unsigned int *ip);
nc_get_att_uint :: Int -> Int -> String -> Int -> IO (Int, [CUInt])
nc_get_att_uint = nc_get_att nc_get_att_uint'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_uint"
nc_get_att_uint'_ :: CInt -> CInt -> CString -> Ptr CUInt -> IO CInt
-- int nc_get_att_longlong(int ncid, int varid, const char *name,
-- long long *ip);
nc_get_att_longlong :: Int -> Int -> String -> Int -> IO (Int, [CLLong])
nc_get_att_longlong = nc_get_att nc_get_att_longlong'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_longlong"
nc_get_att_longlong'_ :: CInt -> CInt -> CString -> Ptr CLLong -> IO CInt
-- int nc_get_att_ulonglong(int ncid, int varid, const char *name,
-- unsigned long long *ip);
nc_get_att_ulonglong :: Int -> Int -> String -> Int -> IO (Int, [CULLong])
nc_get_att_ulonglong = nc_get_att nc_get_att_ulonglong'_ fromIntegral
foreign import ccall safe "Data/NetCDF/Raw.chs.h nc_get_att_ulonglong"
nc_get_att_ulonglong'_ :: CInt -> CInt -> CString -> Ptr CULLong -> IO CInt