/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*+ hlimits.h
   *** This file contains all hard coded limits for the library
   *** and reserved vdata/vgroup names and classes.
   *** Also pre-defined attribute names are contained in this file.
   + */

#ifndef H4_HLIMITS_H
#define H4_HLIMITS_H

#include "hdf.h"

#if defined H4_HAVE_WIN32_API
#define HDsetvbuf(F, S, M, Z) (((Z) > 1) ? setvbuf(F, S, M, Z) : setvbuf(F, S, M, 2))
#else
#define HDsetvbuf(F, S, M, Z) setvbuf(F, S, M, Z)
#endif

/**************************************************************************
 *  Generally useful macro definitions
 *   (These are copied from hdf_priv.h and should remain included in both files
 *       because hlimits.h is included from netcdf.h which is used in some
 *       netCDF utilities which don't need or want the rest of the HDF header
 *       files. -QAK - 2/17/99 )
 **************************************************************************/
#ifndef MIN
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#endif

/* ------------------------- General Constants hdf.h  --------------------- */
/* tbuf used as a temporary buffer for small jobs.  The size is
   preferably > 512 but MUST be > ~256.  It is advised that if an
   arbitrarily large buffer (> 100 bytes) is require, dynamic space be
   used.  tbuf lives in the hfile.c */

#ifndef TBUF_SZ
#define TBUF_SZ 1024
#endif

/*  File name max length (old annotations)  */
#define DF_MAXFNLEN 256

/*
 * some max lengths for the Vset interface
 *
 * Except for FIELDNAMELENMAX, change these as you please, they
 * affect memory only, not the file.
 *
 */

#define FIELDNAMELENMAX 128 /* fieldname   : 128 chars max */
#define VSFIELDMAX      256 /* max no of fields per vdata */
#define VSNAMELENMAX    64  /* vdata name  : 64 chars max */
#define VGNAMELENMAX    64  /* vgroup name : 64 chars max */
/* Note: VGNAMELENMAX has been removed from library, test, and tools
   except in mfgr.c and Fortran interface, in favor of dynamic allocation.
   BMR- 1/28/2010 */

/*
 * default max no of objects in a vgroup
 * VGroup will grow dynamically if needed
 */
#define MAXNVELT 64

/*
 * Defaults for linked block operations with Vsets
 */
#define VDEFAULTBLKSIZE 4096
#define VDEFAULTNBLKS   32

/* Max order of a field in a Vdata */
#define MAX_ORDER      65535
#define MAX_FIELD_SIZE 65535

/* ------------------------- Constants for hfile.c --------------------- */
/* Maximum number of files (number of slots for file records) */
#ifndef MAX_FILE
#define MAX_FILE 32
#endif /* MAX_FILE */

/* Maximum length of external filename(s) (used in hextelt.c) */
#ifndef MAX_PATH_LEN
#define MAX_PATH_LEN 1024
#endif /* MAX_PATH_LEN */

/* ndds (number of dd's in a block) default,
   so user need not specify */
#ifndef DEF_NDDS
#define DEF_NDDS 16
#endif /* DEF_NDDS */

/* ndds minimum, to prevent excessive overhead of very small dd-blocks */
#ifndef MIN_NDDS
#define MIN_NDDS 4
#endif /* MIN_NDDS */

/* largest number that will fit into 16-bit word ref variable */
#define MAX_REF ((uint16)65535)

/* length of block and number of blocks for converting 'appendable' data */
/* elements into linked blocks (will eventually be replaced by the newer */
/* variable-length blocks */
#define HDF_APPENDABLE_BLOCK_LEN 4096
#define HDF_APPENDABLE_BLOCK_NUM 16

/* hashing information */
#define HASH_MASK       0xff
#define HASH_BLOCK_SIZE 100

/* ------------------------- Constants for Vxx interface --------------------- */

/*
 * Private conversion buffer stuff
 * VDATA_BUFFER_MAX is the largest buffer that can be allocated for
 *   writing (haven't implemented reading yet).
 * Vtbuf is the buffer
 * Vtbufsize is the buffer size in bytes at any given time.
 * Vtbuf is increased in size as need be
 * BUG: the final Vtbuf never gets freed
 */
#define VDATA_BUFFER_MAX 1000000

/* --------------------- Constants for DFSDxx interface --------------------- */

#define DFS_MAXLEN       255 /*  Max length of label/unit/format strings */
#define DFSD_MAXFILL_LEN 16  /* Current max length for fill_value space */

/* ----------------- Constants for COMPRESSION interface --------------------- */

/* Set the following macro to the value the highest compression scheme is */
#define COMP_MAX_COMP      12
#define COMP_HEADER_LENGTH 14

/* ----------------- Constants for DGROUP interface --------------------- */
#define MAX_GROUPS 8

/* ----------------- Constants for HERROR interface --------------------- */
#define FUNC_NAME_LEN 32

/* error_stack is the error stack.  error_top is the stack top pointer,
   and points to the next available slot on the stack */
#ifndef ERR_STACK_SZ
#define ERR_STACK_SZ 10
#endif

/* max size of a stored error description */
#ifndef ERR_STRING_SIZE
#define ERR_STRING_SIZE 512
#endif

/* ----------------- Constants for NETCDF interface(netcdf.h) ---------------- */
/*
 * This can be as large as the maximum number of stdio streams
 * you can have open on your system.
 */
#define H4_MAX_NC_OPEN MAX_FILE

/*
 * These maximums are enforced by the interface, to facilitate writing
 * applications and utilities.  However, nothing is statically allocated to
 * these sizes internally.
 */
#define H4_MAX_NC_DIMS  5000 /* max dimensions per file */
#define H4_MAX_NC_ATTRS 3000 /* max global or per variable attributes */
#define H4_MAX_NC_VARS  5000 /* max variables per file */
/* This macro changed the behavior of the SDcreate function in HDF4r1.3
 * SDcreate started to fail if SDS name length was greater than 64, instead of truncating
 * it to 64 characters and creating a dataset. Switched back to the old definition.
 * EP 5/5/2000
#define H4_MAX_NC_NAME MIN(256,MIN(VSNAMELENMAX,VGNAMELENMAX)) */

#define H4_MAX_NC_NAME 256 /* max length of a name */
#define H4_MAX_NC_CLASS                                                                                      \
    128                    /* max length of a class name - added this                                        \
because 128 was used commonly in SD for class name, and this will help                    \
changing the class name variable declaration much easier - BMR 4/1/02*/
#define H4_MAX_VAR_DIMS 32 /* max per variable dimensions */

/* These definitions here are for backward/forward compatibility since major
   constants were modified with H4 prefix to avoid conflicts with the
   real NetCDF-3 library   - EIP 9/5/07                                     */

#ifdef H4_HAVE_NETCDF
#define MAX_NC_OPEN  H4_MAX_NC_OPEN
#define MAX_NC_DIMS  H4_MAX_NC_DIMS
#define MAX_NC_VARS  H4_MAX_NC_VARS
#define MAX_NC_NAME  H4_MAX_NC_NAME
#define MAX_NC_CLASS H4_MAX_NC_CLASS
#define MAX_VAR_DIMS H4_MAX_VAR_DIMS
#endif

/* ----------------- Constants for MFGR interface --------------------- */
#define H4_MAX_GR_NAME 256 /* max length of a name */

/* -----------  Reserved classes and names for vdatas/vgroups -----*/

/* The names of the Vgroups created by the GR interface, from mfgr.h */
#define GR_NAME "RIG0.0" /* name of the Vgroup containing all the images */
#define RI_NAME                                                                                              \
    "RI0.0" /* name of a Vgroup containing information a                                                     \
               bout one image */
#define RIGATTRNAME                                                                                          \
    "RIATTR0.0N" /* name of a Vdata containing an                                                            \
                    attribute */
#define RIGATTRCLASS                                                                                         \
    "RIATTR0.0C" /* class of a Vdata containing an                                                           \
                    attribute */
/* Vdata and Vgroup attributes use the same class as that of SD attr,
 *  _HDF_ATTRIBUTE  "Attr0.0"  8/1/96 */

/* classes of the Vdatas/Vgroups created by the SD interface,
   from nc_priv.h  */
#define _HDF_ATTRIBUTE "Attr0.0"
/* class of a Vdata containing SD interface attribute */
#define _HDF_VARIABLE "Var0.0"
/* class of a Vgroup representing an SD NDG */
#define _HDF_SDSVAR "SDSVar"
/* class of a Vdata indicating its group is an SDS variable */
/* - only after hdf4r2 */
#define _HDF_CRDVAR "CoordVar"
/* name of a Vdata indicating its group is a coordinate variable */
/* - only after hdf4r2 */
#define _HDF_DIMENSION "Dim0.0"
/* class of a Vgroup representing an SD dimension */
#define _HDF_UDIMENSION "UDim0.0"
/* class of a Vgroup representing an SD UNLIMITED dimension*/
#define DIM_VALS "DimVal0.0"
/* class of a Vdata containing an SD dimension size and fake values */
#define DIM_VALS01 "DimVal0.1"
/* class of a Vdata containing an SD dimension size */
#define _HDF_CDF "CDF0.0"
/* DATA is defined in DTM. Change DATA to DATA0
  #define DATA              "Data0.0" */
#define DATA0           "Data0.0"
#define ATTR_FIELD_NAME "VALUES"

/* The following vdata class name is reserved by the Chunking interface.
   originally defined in 'hchunks_priv.h'. The full class name
   currently is "_HDF_CHK_TBL_0". -GV 9/25/97

   Made the vdata class name available to other interfaces since it is needed
   during hmap project. -BMR 11/11/2010 */
#define _HDF_CHK_TBL_CLASS     "_HDF_CHK_TBL_" /* 13 bytes */
#define _HDF_CHK_TBL_CLASS_VER 0               /* zero version number for class */

/*
#define NUM_INTERNAL_VGS    6
char *INTERNAL_HDF_VGS[] = {_HDF_VARIABLE, _HDF_DIMENSION, _HDF_UDIMENSION,
        _HDF_CDF, GR_NAME, RI_NAME};

#define NUM_INTERNAL_VDS    8
char *INTERNAL_HDF_VDS[] = {DIM_VALS, DIM_VALS01, _HDF_ATTRIBUTE, _HDF_SDSVAR,
        _HDF_CRDVAR, "_HDF_CHK_TBL_", RIGATTRNAME, RIGATTRCLASS};

*/
/* ------------  pre-defined attribute names ---------------- */
/* For MFGR interface */
#define FILL_ATTR "FillValue"
/* name of an attribute containing the fill value */

/* For SD interface  */
#define _FillValue "_FillValue"
/* name of an attribute to set fill value for an SDS */
#define _HDF_LongName       "long_name"        /* data/dimension label string  */
#define _HDF_Units          "units"            /* data/dimension unit string   */
#define _HDF_Format         "format"           /* data/dimension format string */
#define _HDF_CoordSys       "coordsys"         /* data coordsys string         */
#define _HDF_ValidRange     "valid_range"      /* valid range of data values  */
#define _HDF_ScaleFactor    "scale_factor"     /* data calibration factor    */
#define _HDF_ScaleFactorErr "scale_factor_err" /* data calibration factor error */
#define _HDF_AddOffset      "add_offset"       /* calibration offset           */
#define _HDF_AddOffsetErr   "add_offset_err"   /*  calibration offset error */
#define _HDF_CalibratedNt   "calibrated_nt"    /* data type of uncalibrated data */
#define _HDF_ValidMax       "valid_max"
#define _HDF_ValidMin       "valid_min"
#define _HDF_Remarks        "remarks"    /* annotation, by DFAN */
#define _HDF_AnnoLabel      "anno_label" /* annotation label, by DFAN */

#endif /* H4_HLIMITS_H */
