318 lines
13 KiB
C
318 lines
13 KiB
C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|||
|
|
* Copyright by The HDF Group. *
|
||
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
||
|
|
* All rights reserved. *
|
||
|
|
* *
|
||
|
|
* This file is part of HDF. The full HDF copyright notice, including *
|
||
|
|
* terms governing use, modification, and redistribution, is contained in *
|
||
|
|
* the COPYING file, which can be found at the root of the source code *
|
||
|
|
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF/releases/. *
|
||
|
|
* If you do not have access to either file, you may request a copy from *
|
||
|
|
* help@hdfgroup.org. *
|
||
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
|
|
||
|
|
/* $Id$ */
|
||
|
|
|
||
|
|
/*-----------------------------------------------------------------------------
|
||
|
|
* File: hchunks.h
|
||
|
|
* Purpose: Header file for Chunked elements
|
||
|
|
* Dependencies: tbbt.c mcache.c
|
||
|
|
* Invokes: none
|
||
|
|
* Contents: Structures & definitions for chunked elements
|
||
|
|
* Structure definitions: DIM_DEF, HCHUNK_DEF
|
||
|
|
* Constant definitions:
|
||
|
|
* Author: -GeorgeV - 9/3/96
|
||
|
|
*---------------------------------------------------------------------------*/
|
||
|
|
|
||
|
|
/* avoid re-inclusion */
|
||
|
|
#ifndef __HCHUNKS_H
|
||
|
|
#define __HCHUNKS_H
|
||
|
|
|
||
|
|
#include "H4api_adpt.h"
|
||
|
|
|
||
|
|
/* required includes */
|
||
|
|
#include "hfile.h" /* special info stuff */
|
||
|
|
|
||
|
|
#ifdef _HCHUNKS_MAIN_
|
||
|
|
/* Private to 'hchunks.c' */
|
||
|
|
|
||
|
|
#include "tbbt.h" /* TBBT stuff */
|
||
|
|
#include "mcache.h" /* caching routines */
|
||
|
|
#include "hcomp.h" /* For Compression */
|
||
|
|
|
||
|
|
/* Define class, class version and name(partial) for chunk table i.e. Vdata */
|
||
|
|
#if 0 /* moved definition of class of vdata to hlimits.h */
|
||
|
|
#define _HDF_CHK_TBL_CLASS "_HDF_CHK_TBL_" /* 13 bytes */
|
||
|
|
#define _HDF_CHK_TBL_CLASS_VER 0 /* zero version number for class */
|
||
|
|
#endif /* moved definition of class of vdata to hlimits.h */
|
||
|
|
#define _HDF_CHK_TBL_NAME "_HDF_CHK_TBL_" /* 13 bytes */
|
||
|
|
|
||
|
|
/* Define field name for each chunk record i.e. Vdata record */
|
||
|
|
#define _HDF_CHK_FIELD_1 "origin" /* 6 bytes */
|
||
|
|
#define _HDF_CHK_FIELD_2 "chk_tag" /* 7 bytes */
|
||
|
|
#define _HDF_CHK_FIELD_3 "chk_ref" /* 7 bytes */
|
||
|
|
#define _HDF_CHK_FIELD_NAMES "origin,chk_tag,chk_ref" /* 22 bytes */
|
||
|
|
|
||
|
|
/* Define version number for chunked header format */
|
||
|
|
#define _HDF_CHK_HDR_VER 0 /* zero version for format header */
|
||
|
|
|
||
|
|
#endif /* _HCHUNKS_MAIN_ */
|
||
|
|
|
||
|
|
/* Public structures */
|
||
|
|
|
||
|
|
/* Structure for each Data array dimension Defintion */
|
||
|
|
typedef struct dim_def_struct {
|
||
|
|
int32 dim_length; /* length of this dimension */
|
||
|
|
int32 chunk_length; /* chunk length along this dimension */
|
||
|
|
int32 distrib_type; /* Data distribution along this dimension */
|
||
|
|
} DIM_DEF, * DIM_DEF_PTR;
|
||
|
|
|
||
|
|
/* Structure for each Chunk Definition*/
|
||
|
|
typedef struct hchunk_def_struct {
|
||
|
|
int32 chunk_size; /* size of this chunk*/
|
||
|
|
int32 nt_size; /* number type size i.e. size of data type */
|
||
|
|
int32 num_dims; /* number of actual dimensions */
|
||
|
|
DIM_DEF *pdims; /* ptr to array of dimension records for this chunk*/
|
||
|
|
int32 chunk_flag; /* multiply specialness? SPECIAL_COMP */
|
||
|
|
|
||
|
|
/* For Compression info */
|
||
|
|
comp_coder_t comp_type; /* Compression type */
|
||
|
|
comp_model_t model_type; /* Compression model type */
|
||
|
|
comp_info *cinfo; /* Compression info struct */
|
||
|
|
model_info *minfo; /* Compression model info struct */
|
||
|
|
}HCHUNK_DEF, * HCHUNK_DEF_PTR;
|
||
|
|
|
||
|
|
/* Private structues */
|
||
|
|
#ifdef _HCHUNKS_MAIN_
|
||
|
|
/* Private to 'hchunks.c' */
|
||
|
|
|
||
|
|
/* Structure for each Data array dimension */
|
||
|
|
typedef struct dim_rec_struct {
|
||
|
|
/* fields stored in chunked header */
|
||
|
|
int32 flag; /* distrib_type(low 8 bits 0-7)
|
||
|
|
- Data distribution along this dimension
|
||
|
|
other(medium low 8 bits 8-15)
|
||
|
|
- regular/unlimited dimension? */
|
||
|
|
int32 dim_length; /* length of this dimension */
|
||
|
|
int32 chunk_length; /* chunk length along this dimension */
|
||
|
|
|
||
|
|
/* info determined from 'flag' field */
|
||
|
|
int32 distrib_type; /* Data distribution along this dimension */
|
||
|
|
int32 unlimited; /* regular(0) or unlimited dimension(1) */
|
||
|
|
|
||
|
|
/* computed fields */
|
||
|
|
int32 last_chunk_length; /* last chunk length along this dimension */
|
||
|
|
int32 num_chunks; /* i.e. "dim_length / chunk_length" */
|
||
|
|
} DIM_REC, * DIM_REC_PTR;
|
||
|
|
|
||
|
|
/* Structure for each Chunk */
|
||
|
|
typedef struct chunk_rec_struct {
|
||
|
|
int32 chunk_number; /* chunk number from coordinates i.e. origin */
|
||
|
|
int32 chk_vnum; /* chunk vdata record number i.e. position in table*/
|
||
|
|
|
||
|
|
/* chunk record fields stored in Vdata Table */
|
||
|
|
int32 *origin; /* origin -> position of chunk */
|
||
|
|
uint16 chk_tag; /* DFTAG_CHUNK or another Chunked element? */
|
||
|
|
uint16 chk_ref; /* reference number of this chunk */
|
||
|
|
}CHUNK_REC, * CHUNK_REC_PTR;
|
||
|
|
|
||
|
|
/* information on this special chunk data elt */
|
||
|
|
typedef struct chunkinfo_t
|
||
|
|
{
|
||
|
|
intn attached; /* how many access records refer to this elt */
|
||
|
|
int32 aid; /* Access id of chunk table i.e. Vdata */
|
||
|
|
|
||
|
|
/* chunked element format header fields */
|
||
|
|
int32 sp_tag_header_len; /* length of the special element header */
|
||
|
|
uint8 version; /* Version of this Chunked element */
|
||
|
|
int32 flag; /* flag for multiply specialness ...*/
|
||
|
|
int32 length; /* the actual length of the data elt */
|
||
|
|
int32 chunk_size; /* the logical size of the chunks */
|
||
|
|
int32 nt_size; /* number type size i.e. size of data type */
|
||
|
|
uint16 chktbl_tag; /* DFTAG_VH - Vdata header */
|
||
|
|
uint16 chktbl_ref; /* ref of the first chunk table structure(VDATA) */
|
||
|
|
uint16 sp_tag; /* For future use.. */
|
||
|
|
uint16 sp_ref; /* For future use.. */
|
||
|
|
int32 ndims; /* number of dimensions of chunk */
|
||
|
|
DIM_REC *ddims; /* array of dimension records */
|
||
|
|
int32 fill_val_len; /* fill value number of bytes */
|
||
|
|
VOID *fill_val; /* fill value */
|
||
|
|
/* For each specialness, only one for now SPECIAL_COMP */
|
||
|
|
int32 comp_sp_tag_head_len; /* Compression header length */
|
||
|
|
VOID *comp_sp_tag_header; /* compression header */
|
||
|
|
|
||
|
|
/* For Compression info */
|
||
|
|
comp_coder_t comp_type; /* Compression type */
|
||
|
|
comp_model_t model_type; /* Compression model type */
|
||
|
|
comp_info *cinfo; /* Compression info struct */
|
||
|
|
model_info *minfo; /* Compression model info struct */
|
||
|
|
|
||
|
|
/* additional memory resident data structures to be used */
|
||
|
|
int32 *seek_chunk_indices; /* chunk array indicies relative
|
||
|
|
to the other chunks */
|
||
|
|
int32 *seek_pos_chunk; /* postion within the current chunk */
|
||
|
|
int32 *seek_user_indices; /* user postion within the element */
|
||
|
|
TBBT_TREE *chk_tree; /* TBBT tree of all accessed table entries
|
||
|
|
i.e. CHUNK_REC's read/written/modified */
|
||
|
|
MCACHE *chk_cache; /* chunk cache */
|
||
|
|
int32 num_recs; /* number of Table(Vdata) records */
|
||
|
|
}
|
||
|
|
chunkinfo_t;
|
||
|
|
#endif /* _HCHUNKS_MAIN_ */
|
||
|
|
|
||
|
|
#if defined c_plusplus || defined __cplusplus
|
||
|
|
extern "C"
|
||
|
|
{
|
||
|
|
#endif /* c_plusplus || __cplusplus */
|
||
|
|
|
||
|
|
/*
|
||
|
|
** from hchunks.c
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* User Public */
|
||
|
|
HDFLIBAPI int32 HMCcreate
|
||
|
|
(int32 file_id, /* IN: file to put linked chunk element in */
|
||
|
|
uint16 tag, /* IN: tag of element */
|
||
|
|
uint16 ref, /* IN: ref of element */
|
||
|
|
uint8 nlevels, /* IN: number of levels of chunks */
|
||
|
|
int32 fill_val_len, /* IN: fill value length in bytes */
|
||
|
|
VOID *fill_val, /* IN: fill value */
|
||
|
|
HCHUNK_DEF *chk_array /* IN: structure describing chunk distribution
|
||
|
|
can be an array? but we only handle 1 level */);
|
||
|
|
|
||
|
|
HDFLIBAPI intn HMCgetcompress
|
||
|
|
(accrec_t* access_rec, /* IN: access record */
|
||
|
|
comp_coder_t* comp_type, /* OUT: compression type */
|
||
|
|
comp_info* c_info /* OUT: retrieved compression info */);
|
||
|
|
|
||
|
|
HDFLIBAPI intn HMCgetcomptype
|
||
|
|
(int32 access_id, /* IN: access record */
|
||
|
|
comp_coder_t* comp_type /* OUT: compression type */);
|
||
|
|
|
||
|
|
HDFLIBAPI intn HMCgetdatainfo
|
||
|
|
(int32 file_id, /* IN: file in which element is located */
|
||
|
|
uint16 data_tag,
|
||
|
|
uint16 data_ref,
|
||
|
|
int32 *chk_coord, /* IN: chunk coord array or NULL for non-chunk SDS */
|
||
|
|
uintn start_block,/* IN: data block to start at, 0 base */
|
||
|
|
uintn info_count, /* IN: size of offset/length lists */
|
||
|
|
int32 *offsetarray, /* OUT: array to hold offsets */
|
||
|
|
int32 *lengtharray); /* OUT: array to hold lengths */
|
||
|
|
|
||
|
|
HDFLIBAPI intn HMCgetdatasize
|
||
|
|
(int32 file_id, /* IN: file in which element is located */
|
||
|
|
uint8 *p, /* IN: buffer of special info header */
|
||
|
|
int32 *comp_size, /* OUT: size of compressed data */
|
||
|
|
int32 *orig_size /* OUT: size of non-compressed data */);
|
||
|
|
|
||
|
|
HDFLIBAPI int32 HMCsetMaxcache
|
||
|
|
(int32 access_id, /* IN: access aid to mess with */
|
||
|
|
int32 maxcache, /* IN: max number of pages to cache */
|
||
|
|
int32 flags /* IN: flags = 0, HMC_PAGEALL */);
|
||
|
|
|
||
|
|
HDFLIBAPI int32 HMCwriteChunk
|
||
|
|
(int32 access_id, /* IN: access aid to mess with */
|
||
|
|
int32 *origin, /* IN: origin of chunk to write */
|
||
|
|
const VOID *datap /* IN: buffer for data */);
|
||
|
|
|
||
|
|
HDFLIBAPI int32 HMCreadChunk
|
||
|
|
(int32 access_id, /* IN: access aid to mess with */
|
||
|
|
int32 *origin, /* IN: origin of chunk to read */
|
||
|
|
VOID *datap /* IN: buffer for data */);
|
||
|
|
|
||
|
|
HDFLIBAPI int32 HMCPcloseAID
|
||
|
|
(accrec_t *access_rec /* IN: access record of file to close */);
|
||
|
|
|
||
|
|
HDFLIBAPI int32 HMCPgetnumrecs /* has to be here because used in hfile.c */
|
||
|
|
(accrec_t * access_rec, /* IN: access record to return info about */
|
||
|
|
int32 *num_recs /* OUT: length of the chunked elt */);
|
||
|
|
|
||
|
|
/* Library Private */
|
||
|
|
#ifdef _HCHUNKS_MAIN_
|
||
|
|
/* tbbt.h helper routines */
|
||
|
|
intn chkcompare(void * k1, /* IN: first key */
|
||
|
|
void * k2, /* IN: second key */
|
||
|
|
intn cmparg /* IN: not sure? */);
|
||
|
|
void chkfreekey(void * key /*IN: chunk key */ );
|
||
|
|
void chkdestroynode(void * n /* IN: chunk record */ );
|
||
|
|
|
||
|
|
/* Private to 'hchunks.c' */
|
||
|
|
extern int32 HMCPstread
|
||
|
|
(accrec_t *access_rec /* IN: access record to fill in */);
|
||
|
|
|
||
|
|
extern int32 HMCPstwrite
|
||
|
|
(accrec_t *access_rec /* IN: access record to fill in */);
|
||
|
|
|
||
|
|
extern int32 HMCPseek
|
||
|
|
(accrec_t *access_rec, /* IN: access record to mess with */
|
||
|
|
int32 offset, /* IN: seek offset */
|
||
|
|
int origin /* IN: where we should calc the offset from */);
|
||
|
|
|
||
|
|
extern int32 HMCPchunkread
|
||
|
|
(VOID *cookie, /* IN: access record to mess with */
|
||
|
|
int32 chunk_num, /* IN: chunk to read */
|
||
|
|
VOID *datap /* OUT: buffer for data */);
|
||
|
|
|
||
|
|
extern int32 HMCPread
|
||
|
|
(accrec_t * access_rec, /* IN: access record to mess with */
|
||
|
|
int32 length, /* IN: number of bytes to read */
|
||
|
|
void * data /* OUT: buffer for data */);
|
||
|
|
|
||
|
|
extern int32 HMCPchunkwrite
|
||
|
|
(VOID *cookie, /* IN: access record to mess with */
|
||
|
|
int32 chunk_num, /* IN: chunk number */
|
||
|
|
const VOID *datap /* IN: buffer for data */);
|
||
|
|
|
||
|
|
extern int32 HMCPwrite
|
||
|
|
(accrec_t *access_rec, /* IN: access record to mess with */
|
||
|
|
int32 length, /* IN: number of bytes to write */
|
||
|
|
const void * data /* IN: buffer for data */);
|
||
|
|
|
||
|
|
extern intn HMCPendaccess
|
||
|
|
(accrec_t *access_rec /* IN: access record to close */);
|
||
|
|
|
||
|
|
extern int32 HMCPinfo
|
||
|
|
(accrec_t *access_rec, /* IN: access record of access elemement */
|
||
|
|
sp_info_block_t *info_chunk /* OUT: information about the special element */);
|
||
|
|
|
||
|
|
extern int32 HMCPinquire
|
||
|
|
(accrec_t * access_rec, /* IN: access record to return info about */
|
||
|
|
int32 *pfile_id, /* OUT: file ID; */
|
||
|
|
uint16 *ptag, /* OUT: tag of info record; */
|
||
|
|
uint16 *pref, /* OUT: ref of info record; */
|
||
|
|
int32 *plength, /* OUT: length of element; */
|
||
|
|
int32 *poffset, /* OUT: offset of element -- meaningless */
|
||
|
|
int32 *pposn, /* OUT: current position in element; */
|
||
|
|
int16 *paccess, /* OUT: access mode; */
|
||
|
|
int16 *pspecial /* OUT: special code; */);
|
||
|
|
|
||
|
|
#endif /* _HCHUNKS_MAIN_ */
|
||
|
|
|
||
|
|
#if defined c_plusplus || defined __cplusplus
|
||
|
|
}
|
||
|
|
#endif /* c_plusplus || __cplusplus */
|
||
|
|
|
||
|
|
#ifndef _HCHUNKS_MAIN_
|
||
|
|
/* not in master file hchunk.c */
|
||
|
|
extern funclist_t chunked_funcs; /* functions to perform chunking */
|
||
|
|
|
||
|
|
#else /* in hchunks.c */
|
||
|
|
|
||
|
|
/* the accessing special function table for chunks */
|
||
|
|
funclist_t chunked_funcs =
|
||
|
|
{
|
||
|
|
HMCPstread,
|
||
|
|
HMCPstwrite,
|
||
|
|
HMCPseek,
|
||
|
|
HMCPinquire,
|
||
|
|
HMCPread,
|
||
|
|
HMCPwrite,
|
||
|
|
HMCPendaccess,
|
||
|
|
HMCPinfo,
|
||
|
|
NULL /* no routine registerd */
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#endif /* __HCHUNKS_H */
|