summaryrefslogtreecommitdiffstats
path: root/src/H5Fcompact.c
blob: 3a36edbea79d22d2aa6ea7686ee128cf1ae98dcf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * Copyright (C) 2000-2001 NCSA
 *                         All rights reserved.
 *
 * Programmer:  Raymond Lu <slu@ncsa.uiuc.edu> 
 *              August 5, 2002 
 *
 * Purpose:     Compact dataset I/O functions.  These routines are similar
 *              H5F_contig_* and H5F_istore_*.
 */

#define H5F_PACKAGE             /*suppress error about including H5Fpkg   */

#include "H5private.h"
#include "H5Eprivate.h"
#include "H5Fpkg.h"
#include "H5Oprivate.h"
#include "H5FDprivate.h"        /*file driver                             */
#include "H5FLprivate.h"        /*Free Lists                              */

/* Interface initialization */
#define PABLO_MASK      H5Fcompact_mask
static int              interface_initialize_g = 0;
#define INTERFACE_INIT NULL

/*-------------------------------------------------------------------------
 * Function:    H5F_compact_readv
 *
 * Purpose:     Reads some data vectors from a dataset into a buffer.
 *              The data is in compact dataset.  The address is relative 
 *              to the beginning address of the dataset.  The offsets and
 *              sequence lengths are in bytes.
 *
 * Return:      Non-negative on success/Negative on failure
 *
 * Programmer:  Raymond Lu 
 *              August 5, 2002 
 *
 * Notes:
 *              Offsets in the sequences must be monotonically increasing
 * 
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
herr_t
H5F_compact_readv(H5F_t *f, const H5O_layout_t *layout, size_t nseq, 
                  size_t size_arr[], hsize_t offset_arr[], 
                  hid_t dxpl_id, void *_buf/*out*/)
{
    unsigned char       *buf=(unsigned char *)_buf;
    size_t              size;
    haddr_t             offset;
    unsigned            u;
    herr_t              ret_value=SUCCEED;
    
    FUNC_ENTER_NOAPI(H5F_compact_readv, FAIL);

    for(u=0; u<nseq; u++) {
        size=size_arr[u];
        offset=offset_arr[u];
        if(size > 0) {
            HDmemcpy(buf, (unsigned char*)layout->buf+offset, size); 
            buf +=size;
        }
    }

done:
    FUNC_LEAVE(ret_value);
}   /* end H5F_compact_readv() */

/*-------------------------------------------------------------------------
 * Function:    H5F_compact_writev
 * 
 * Purpose:     Writes some data vectors from a dataset into a buffer.
 *              The data is in compact dataset.  The address is relative 
 *              to the beginning address for the file.  The offsets and
 *              sequence lengths are in bytes.  This function only copies
 *              data into the buffer in the LAYOUT struct and mark it 
 *              as DIRTY.  Later in H5D_close, the data is copied into 
 *              header message in memory.  
 *              
 * Return:      Non-negative on success/Negative on failure
 * 
 * Programmer:  Raymond Lu
 *              August 5, 2002
 *              
 * Notes:       
 *              Offsets in the sequences must be monotonically increasing
 *              
 * Modifications:
 * 
 *-------------------------------------------------------------------------
 */
herr_t
H5F_compact_writev(H5F_t *f, H5O_layout_t *layout, size_t nseq,
                  size_t size_arr[], hsize_t offset_arr[], 
                  hid_t dxpl_id, const void *_buf)
{
    unsigned char       *buf=(unsigned char *)_buf;
    size_t              size;
    haddr_t             offset;
    unsigned            u;
    herr_t              ret_value=SUCCEED;
    
    FUNC_ENTER_NOAPI(H5F_compact_writev, FAIL);

    for(u=0; u<nseq; u++) {
        size=size_arr[u];
        offset=offset_arr[u];
        if(size > 0) {
            HDmemcpy((unsigned char*)layout->buf+offset, buf, size);
            buf += size;
        }
    }

    layout->dirty = TRUE;

done:   
    FUNC_LEAVE(ret_value);
}   /* end H5F_compact_writev */