Provided by: libgetdata-doc_0.11.0-14_all bug

NAME

       gd_entry — retrieve a Dirfile field's metadata

SYNOPSIS

       #include <getdata.h>

       int gd_entry(DIRFILE *dirfile, const char *field_code, gd_entry_t *entry);

DESCRIPTION

       The  gd_entry()  function queries a dirfile(5) database specified by dirfile and retrieves
       the metadata associated with the field specified by field_code.  If field_code contains  a
       valid representation suffix, the suffix will be ignored.

       The  dirfile argument must point to a valid DIRFILE object previously created by a call to
       gd_open(3).

       The entry will be stored in the gd_entry_t structure  indicated  by  the  entry  argument,
       which  must be allocated by the caller.  Members available in this structure depend on the
       field type of the field queried.  See below for a complete description of this data type.

       Strings members in entry filled by this function  (including,  depending  on  field  type:
       field,  elements  of  the  in_fields  and scalar arrays, the LINTERP table member) will by
       dynamically allocated by gd_entry().  Only strings provided  by  the  gd_entry_t  for  the
       particular  field  type  described  will  be  allocated.   By  default,  these strings are
       allocated using strdup(3), but this can be  changed  by  specifying  an  alternate  memory
       manager  via gd_alloc_funcs(3).  The caller is responsible for deallocating these strings.
       The gd_free_entry_strings(3) function is provided as a convenience to do this.

       If the entry's metadata contains scalar field codes  which  cannot  be  dereferenced,  the
       associated  numerical  field  parameter  will  be  initialised to zero.  In this case, the
       GD_EN_CALC flag in the returned entry object will NOT be set.

       The returned entry structure, including strings and their pointers may be freely  modified
       by the caller.

RETURN VALUE

       Upon  successful  completion, gd_entry() returns zero and writes the field metadata in the
       supplied gd_entry_t buffer.  On error, the supplied gd_entry_t buffer is not modified.  In
       this case, gd_entry() returns a negative-valued error code.  Possible error codes are:

       GD_E_ALLOC
               The library was unable to allocate memory.

       GD_E_BAD_CODE
               The field specified by field_code was not found in the database.

       GD_E_BAD_DIRFILE
               The supplied dirfile was invalid.

       The  error  code  is  also  stored  in  the DIRFILE object and may be retrieved after this
       function returns by calling gd_error(3).  A descriptive error string for the error may  be
       obtained by calling gd_error_string(3).

THE ENTRY TYPE

       Members  available  in  the  gd_entry_t structure depend on the field type described.  All
       gd_entry_t objects are guaranteed to have at least:

              typedef struct {
                ...

                const char  *field;          /* field code */
                gd_entype_t  field_type;     /* field type */
                int          fragment_index; /* format fragment index */
                unsigned     flags;          /* entry flags */

                ...
              } gd_entry_t;

       The field member is the field code of the entry (i.e. its string name).  If  the  call  to
       gd_entry(3) is successful, this will be the field name specified as part of the field_code
       argument.

       The field_type member indicates the field type of the entry.   This  is  an  integer  type
       equal to one of the following symbols:

              GD_BIT_ENTRY, GD_CARRAY_ENTRY, GD_CONST_ENTRY, GD_DIVIDE_ENTRY, GD_INDEX_ENTRY,
              GD_LINCOM_ENTRY, GD_LINTERP_ENTRY, GD_MPLEX_ENTRY, GD_MULTIPLY_ENTRY,
              GD_PHASE_ENTRY, GD_POLYNOM_ENTRY, GD_RAW_ENTRY, GD_RECIP_ENTRY, GD_SBIT_ENTRY,
              GD_STRING_ENTRY, GD_WINDOW_ENTRY.

       GD_INDEX_ENTRY is a special field type used only for the implicit INDEX field.  The  other
       entry types are explained in detail in dirfile-format(5).

       The  fragment_index member indicates the format specification fragment in which this field
       is defined.  This is an integer index to the Dirfile's list of parsed format specification
       fragments.   The  name  of  the  file  corresponding  to fragment_index may be obtained by
       calling gd_fragmentname(3).  A value of zero for this field indicates that  the  field  is
       defined in the primary fragment, the file called format in the root dirfile directory (see
       dirfile(5)).

       The flags member is a bitwise or'd collection of the following entry flags:

       GD_EN_CALC
               This bit is set only when the non-literal scalar parameter field  codes  specified
               in the scalar member have been resolved, and the corresponding numerical parameter
               have been initialised with these data.  When one  or  more  field  code  does  not
               exist,  or  is  invalid  (ie.  when  gd_validate(3)  would  fail  on the specified
               field_code  with  the  error  GD_E_BAD_SCALAR),  then  the  unresolved   numerical
               parameters are initialised to zero, and this flag is not be set.  If the requested
               field does not allow non-literal scalar parameters (CARRAY, CONST, DIVIDE,  INDEX,
               LINTERP, MULTIPLY, STRING), the value of this bit is unspecified.

       GD_EN_COMPSCAL
               For  fields  which permit complex valued parameters (LINCOM, POLYNOM, RECIP), this
               bit is set only when at least one parameter is complex valued.   For  other  field
               types, the value of this bit is unspecified.

       GD_EN_HIDDEN
               This  bit is set only when the field has been hidden by the /HIDDEN directive (see
               gd_hidden(3)).

       Remaining fields in the gd_entry_t structure depend on the value of  field_type.   Callers
       are  advised  to  check  field_type  before  attempting  to  access the remaining members.
       Members for different field types may be stored in the same  physical  location  in  core.
       Accordingly,  attempting  to  access  a member not declared for the appropriate field type
       will have unspecified results.

   Scalar Parameter Members
       A gd_entry_t describing any field type which permits non-literal scalar  field  parameters
       (BIT, LINCOM, MPLEX, PHASE, POLYNOM, RAW, RECIP, SBIT, or WINDOW) will also provide:

              typedef struct {
                ...

                const char *scalar[GD_MAX_POLY_ORD + 1];   /* param. fields */
                int         scalar_ind[GD_MAX_POLY_ORD + 1];
                                                          /* CARRAY indices */

                ...
              } gd_entry_t;

       Only certain elements of these arrays will be initialised:

       •      For  BIT and SBIT fields, the first element corresponds to bitnum and the second to
              numbits.  The remainder are uninitialised.

       •      For LINCOM fields, the first GD_MAX_LINCOM elements correspond to the  slopes  (cm)
              and the next GD_MAX_LINCOM elements correspond to the offsets (cb).  Only the first
              n_fields elements of these two sets  are  initialised.   Notably,  this  means  for
              n_fields  <  GD_MAX_LINCOM,  there  will be uninitialised elements in the middle of
              these arrays between the element corresponding to cm[n_fields - 1] and the  element
              corresponding to cb[0].

       •      For  MPLEX  fields,  the  first  element corresponds to count_val and the second to
              period.  The remainder are uninitialised.

       •      For PHASE fields, the first  element  corresponds  to  shift.   The  remainder  are
              uninitialised.

       •      For  POLYNOM  fields,  these arrays correspond with the co-efficients ca.  Only the
              first poly_ord + 1 elements are initialised.

       •      For  RAW  fields,  the  first  element  corresponds  to  spf.   The  remainder  are
              uninitialised.

       •      For  RECIP  fields,  the first element corresponds to cdividend.  The remainder are
              uninitialised.

       •      For WINDOW fields, the first element corresponds to threshold.  The  remainder  are
              uninitialised.

       The  scalar  parameters  are  NULL  if  a literal parameter was used, or else a field code
       specifying the scalar parameters.

       If an element of scalar specifies  a  CARRAY  field,  the  corresponding  scalar_ind  will
       indicate the element of the CARRAY used.  For CONST fields, scalar_ind will be -1.

   BIT and SBIT Members
       A gd_entry_t describing a BIT or SBIT entry, will also provide:

              typedef struct {
                ...

                const char *in_fields[1];     /* input field code */
                int         bitnum;           /* first bit */
                int         numbits;          /* bit length */

                ...
              } gd_entry_t;

       The in_fields member is an array of length one containing the input field code.

       The bitnum member indicates the number of the first bit (counted from zero) extracted from
       the input.  If this value was specified as a scalar field code, this will be the numerical
       value of that field, and scalar[0] will contain the field code itself, otherwise scalar[0]
       will be NULL.

       The numbits member indicates the number of bits which are extracted from  the  input.   If
       this  value was specified as a scalar field code, this will be the numerical value of that
       field, and scalar[1] will contain the field code itself, otherwise scalar[1] will be NULL.

   CARRAY Members
       A gd_entry_t describing a CARRAY entry, will also provide:

              typedef struct {
                ...

                gd_type_t  const_type; /* data type in format specification */
                size_t     array_len;  /* length of array data */

                ...
              } gd_entry_t;

       The const_type member indicates the data type of the constant value stored in  the  format
       file  metadata.   See  gd_getdata(3)  for  a  list of valid values that a variable of type
       gd_type_t may take.

       The array_len member gives the number of elements in the array.

   CONST Members
       A gd_entry_t describing a CONST entry, will also provide:

              typedef struct {
                ...

                gd_type_t  const_type; /* data type in format specification */

                ...
              } gd_entry_t;

       The const_type member indicates the data type of the constant value stored in  the  format
       file  metadata.   See  gd_getdata(3)  for  a  list of valid values that a variable of type
       gd_type_t may take.

   DIVIDE, INDIR, MULTIPLY, and SINDIR Members
       A gd_entry_t describing a DIVIDE, INDIR, MULTIPLY, or SINDIR entry, will also provide:

              typedef struct {
                ...

                const char *in_fields[2];     /* input field codes */

                ...
              } gd_entry_t;

       The in_fields member is an array of length two containing the input field codes.

   INDEX Members
       A gd_entry_t describing an INDEX entry, which is used only for the implicit  INDEX  field,
       provides no additional data.

   LINCOM Members
       A gd_entry_t describing a LINCOM entry, will also provide:

              typedef struct {
                ...

                int            n_fields;                 /* # of inputs */
                const char    *in_fields[GD_MAX_LINCOM]; /* input fields(s) */
                double complex cm[GD_MAX_LINCOM];        /* scale factor(s) */
                double         m[GD_MAX_LINCOM];         /* scale factor(s) */
                double complex cb[GD_MAX_LINCOM];        /* offset terms(s) */
                double         b[GD_MAX_LINCOM];         /* offset terms(s) */

                ...
              } gd_entry_t;

       The  n_fields  member  indicates  the  number of input fields.  It will be between one and
       GD_MAX_LINCOM inclusive.  GD_MAX_LINCOM is defined in getdata.h as the maximum  number  of
       input fields permitted by a LINCOM.

       The  in_fields  member  is  an  array  of  length GD_MAX_LINCOM containing the input field
       code(s).  Only the first n_fields elements of this array are initialised.   The  remaining
       elements contain uninitialised data.

       The cm and cb members are arrays of the scale factor(s) and offset term(s) for the LINCOM.
       Only the first n_fields elements of these array contain meaningful data.  If any of  these
       values  were  specified  as  a scalar field code, this will be the numerical value of that
       field.  The field code corresponding to cm[i] will be stored in scalar[i]  and  the  field
       code  associated  with  cb[i]  will be stored in scalar[i + GD_MAX_LINCOM].  Otherwise the
       corresponding scalar member will be NULL.  See NOTES below on changes to  the  declaration
       of cm and cb when using the C89 GetData API.

       The elements of m and b are the real parts of the corresponding elements of cm and cb.

   LINTERP Members
       A gd_entry_t describing a LINTERP entry, will also provide:

              typedef struct {
                ...

                const char *table             /* linterp table filename */
                const char *in_fields[1];     /* input field code */

                ...
              } gd_entry_t;

       The table member is the pathname to the look up table on disk.  This the path as it appars
       in the format specification.  It may be a path relative to the fragment directory.  For an
       canonicalised, absolute version of this path, see gd_linterp_tablename(3).

       The in_fields member is an array of length one containing the input field code.

   MPLEX Members
       A gd_entry_t describing a MPLEX entry, will also provide:

              typedef struct {
                ...

                const char *in_fields[2];   /* input field codes */
                int         count_val;      /* value of the multiplex index */
                int         period;         /* samples between successive
                                                                    indices */

                ...
              } gd_entry_t;

       The  in_fields  member  contains  the  field  codes of the input field (element 0) and the
       multiplex index field (element 1).

       The count_val member is the value of the multiplex index field when the  output  field  is
       stored in the input field.

       The  period member is the number of samples between successive occurrances of count_val in
       the index vector, or zero, if this is not  known  or  constant.   This  is  only  used  to
       determine  how  far  to  look  back  for  a  starting  value  for  the  output  field; see
       gd_mplex_lookback(3).

   PHASE Members
       A gd_entry_t describing a PHASE entry, will also provide:

              typedef struct {
                ...

                const char *in_fields[1];     /* input field code */
                gd_int64_t  shift;            /* phase shift */

                ...
              } gd_entry_t;

       The in_fields member is an array of length one containing the input field code.

       The shift member indicates the shift in samples.  The gd_int64_t type is a  64-bit  signed
       integer  type.   A  positive value indicates a shift forward in time (towards larger frame
       numbers).  If this value was specified as a scalar field code, this will be the  numerical
       value of that field, and scalar[0] will contain the field code itself, otherwise scalar[0]
       will be NULL.

   POLYNOM Members
       A gd_entry_t describing a POLYNOM entry, will also provide:

              typedef struct {
                ...

                int            poly_ord;                /* polynomial order */
                const char    *in_fields[1];            /* input field(s) */
                double complex ca[GD_MAX_POLY_ORD + 1]; /* co-efficients(s) */
                double         a[GD_MAX_POLY_ORD + 1];  /* co-efficients(s) */

                ...
              } gd_entry_t;

       The poly_ord member indicates the order of the polynomial.  It will  be  between  one  and
       GD_MAX_POLY_ORD  inclusive.   GD_MAX_POLY_ORD is defined in getdata.h as the maximum order
       of polynomial permitted by a POLYNOM.

       The in_fields member is an array of length one containing the input field code.

       The ca members are arrays of the co-efficient(s) for the POLYNOM.  Only the first poly_ord
       +  1  elements  of  this  array  contains  meaningful  data.   If any of these values were
       specified as a scalar field code, this will be the numerical value  of  that  field.   The
       field   code   corresponding  to  ca[i]  will  be  stored  in  scalar[i].   Otherwise  the
       corresponding scalar member will be NULL.  See NOTES below on changes to  the  declaration
       of ca when using the C89 GetData API.

       The elements of a are the real parts of the corresponding elements of ca.

   RAW Members
       A gd_entry_t describing a RAW entry, will also provide:

              typedef struct {
                ...

                unsigned int  spf;          /* samples per frame on disk */
                gd_type_t     data_type;    /* data type on disk */

                ...
              } gd_entry_t;

       The  spf  member contains the samples per frame of the binary data on disk.  If this value
       was specified as a scalar field code, this will be the numerical value of that field,  and
       scalar[0] will contain the field code itself, otherwise scalar[0] will be NULL.

       The  data_type  member  indicates  the  data  type  of  the  binary  data  on  disk.   See
       gd_getdata(3) for a list of valid values that a variable of type gd_type_t may take.

   RECIP Members
       A gd_entry_t describing a RECIP entry, will also provide:

              typedef struct {
                ...

                const char    *in_fields[1];         /* input field code */
                double complex cdividend;            /* scalar dividend */
                double         dividend;             /* scalar dividend */

                ...
              } gd_entry_t;

       The in_fields member is an array of length one containing the input field code.

       The cdividend member provides the constant dividend of the  computed  division.   If  this
       value  was  specified  as  a  scalar  field code, this will be the numerical value of that
       field, and scalar[0] will contain the field code itself, otherwise scalar[0] will be NULL.
       The dividend member contains the real part of cdividend.

   STRING Members
       A gd_entry_t describing a STRING entry provides no additional data.

   WINDOW Members
       A gd_entry_t describing a WINDOW entry, will also provide:

              typedef struct {
                ...

                const char    *in_fields[2];  /* input field codes */
                gd_windop_t   windop;         /* comparison operator */
                gd_triplet_t  threshold;      /* the value compared against */

                ...
              } gd_entry_t;

       The in_fields member contains the field codes of the input field (element 0) and the check
       field (element 1).

       The windop  member  equals  one  of  the  following  symbols,  indicating  the  particular
       comparison performed on the check field:

       GD_WINDOP_EQ
               data are extracted when the check field equals threshold;

       GD_WINDOP_GE
               data are extracted when the check field is greater than or equal to threshold;

       GD_WINDOP_GT
               data are extracted when the check field is strictly greater than threshold;

       GD_WINDOP_LE
               data are extracted when the check field is less than or equal to threshold;

       GD_WINDOP_LT
               data are extracted when the check field is strictly less than threshold;

       GD_WINDOP_NE
               data are extracted when the check field is not equal to threshold;

       GD_WINDOP_SET
               data  are  extracted  when  at least one bit in threshold is also set in the check
               field;

       GD_WINDOP_CLR
               data are extracted when at least one bit in threshold is  not  set  in  the  check
               field.

       The  threshold  is  the value against which the check field is compared.  The gd_triplet_t
       type is defined as:

              typedef union {
                gd_int64_t i;
                gd_uint64_t u;
                double r;
              } gd_triplet_t;

       The particular element of the union to use depends on the value of windop:

       •      For GD_WINDOP_EQ and GD_WINDOP_NE, the signed integer element, threshold.i, is set;

       •      For GD_WINDOP_SET and GD_WINDOP_CLR, the unsigned integer element, threshold.u,  is
              set;

       •      For all other values of windop, the floating point element, threshold.r, is set.

NOTES

       When  using  the  C89 GetData API (by defining GD_C89_API before including getdata.h), the
       data types and names of several of the entry  parameters  are  different.   The  following
       table lists the correspondences between members in the C99 and C89 APIs.

                             C99 API                           C89 API
                              int   bitnum                int   u.bit.bitnum
                              int   numbits               int   u.bit.numbits
                              int   n_fields              int   u.lincom.n_fields
                   double complex   cm[]               double   u.lincom.cm[][2]
                           double   m[]                double   u.lincom.m[]
                   double complex   cb[]               double   u.lincom.cb[][2]
                           double   b[]                double   u.lincom.b[]
                      const char*   table         const char*   u.linterp.table
                              int   count_val             int   u.mplex.count_val
                              int   period                int   u.mplex.period
                       gd_int64_t   shift          gd_int64_t   u.phase.shift
                              int   poly_ord              int   u.polynom.poly_ord
                   double complex   ca[]               double   u.polynom.ca[][2]
                           double   a[]                double   u.polynom.a[]
                     unsigned int   spf          unsigned int   u.raw.spf
                        gd_type_t   data_type       gd_type_t   u.raw.data_type
                   double complex   cdividend          double   u.recip.cdividend[2]
                           double   dividend           double   u.recip.dividend
                        gd_type_t   const_type      gd_type_t   u.scalar.const_type
                           size_t   array_len          size_t   u.scalar.array_len
                      gd_windop_t   windop        gd_windop_t   u.window.windop
                     gd_triplet_t   threshold    gd_triplet_t   u.window.threshold

       In  the  case  of complex valued data in the C89 API, the first element of the two-element
       array is the real part of the complex number, and the  second  element  is  the  imaginary
       part.

HISTORY

       The get_entry() function appeared in GetData-0.3.0.

       In GetData-0.7.0, this function was renamed to gd_entry().

       In  GetData-0.10.0,  the  error return from these functions changed from -1 to a negative-
       valued error code.

   Changes to the gd_entry_t structure
       Field-type specific members have been added to the structure as support  for  those  field
       types have been introduced to the library:

       •      BIT,  LINCOM,  LINTERP,  MULTIPLY,  PHASE,  and RAW were supported in GetData-0.3.0
              (Dirfile Standards Version 5).

       •      CONST and STRING  entries  were  introduced  in  GetData-0.4.0  (Dirfile  Standards
              Version 6); this is also the first version that treats INDEX as a normal field.  In
              earlier versions, trying to retrieve the metadata for the INDEX field would fail.

       •      POLYNOM and SBIT  entries  were  introduced  in  GetData-0.6.0  (Dirfile  Standards
              Version 7).

       •      CARRAY,  DIVIDE,  and  RECIP  entries  were  introduced  in  GetData-0.7.0 (Dirfile
              Standards Version 8).

       •      MPLEX and WINDOW  entries  were  introduced  in  GetData-0.8.0  (Dirfile  Standards
              Version 9).

       •      INDIR,  SARRAY,  and  SINDIR  entries  were  introduced  in GetData-0.10.0 (Dirfile
              Standards Version 10).

       The scalar member appeared in GetData-0.6.0.  This release also  introduced  the  complex-
       valued scalar members (cm, cb, &c.)

       The  scalar_ind  member appeared in GetData-0.7.0.  This was also the first release with a
       working ANSI C (C89) conforming alternate definition.

       Before Getdata-0.8.4, the period member for MPLEX data was named count_max.

       Before GetData-0.9.0, the flags member is missing.  In it's place was:

              int comp_scal;     /* Scalar parameters are complex-valued */

       which was non-zero to indicate complex-valued parameters, which is now  indicated  by  the
       GD_EN_COMPSCAL flag.

SEE ALSO

       dirfile(5),     gd_alloc_funcs(3),    gd_cbopen(3),    gd_error(3),    gd_error_string(3),
       gd_field_list(3),  gd_fragmentname(3),  gd_free_entry_strings(3),  gd_linterp_tablename(3)
       gd_mplex_lookback(3), gd_raw_filename(3), gd_validate(3)