get_entry (3) - Linux Manuals
get_entry: retrieve a dirfile field's metadata
NAME
get_entry --- retrieve a dirfile field's metadataSYNOPSIS
#include <getdata.h>- int get_entry(DIRFILE *dirfile, const char *field_code, gd_entry_t *entry);
DESCRIPTION
The dirfile argument must point to a valid DIRFILE object previously created by a call to dirfile_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 (variously, depending on field type: field, the elements of the in_fields[] array, table; see below) will by dynamically allocated by get_entry() and should not point to allocated memory locations before calling this function. Only strings provided by the gd_entry_t for the particular field type described will be allocated. These strings should be deallocated with free(3) by the caller once they are no longer needed. The dirfile_free_entry_strings(3) function is provided as a convenience to do this.
The returned entry structure, including strings and their pointers may be freely modified by the caller.
RETURN VALUE
Upon successful completion, get_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, get_entry() returns -1 and sets the dirfile error to a non-zero error value. Possible error values are:- 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.
- GD_E_BAD_REPR
- The representation suffix specified in field_code was not recognised.
- GD_E_BAD_SCALAR
- A scalar parameter used in the definition of the field was invalid. The dirfile error may be retrieved by calling get_error(3). A descriptive error string for the last error encountered can be obtained from a call to get_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 file fragment index */
...
} gd_entry_t;
The
field
member is the field code of the entry (i.e. its string name). If the call to
get_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_CONST_ENTRY,~GD_INDEX_ENTRY,~
GD_LINCOM_ENTRY,~GD_LINTERP_ENTRY,~GD_MULTIPLY_ENTRY,~
GD_PHASE_ENTRY,~GD_POLYNOM_ENTRY,~GD_RAW_ENTRY,~GD_SBIT_ENTRY,~
GD_STRING_ENTRY.
GD_INDEX_ENTRY
is a special field type used only for the implicit
INDEX
field. The meaning of the other symbols should be self-explanatory.
The
fragment_index
member indicates the format file fragment in which this field is defined. This
is an integer index to the Dirfile's list of parsed format file fragments. The
name of the file corresponding to
fragment_index
may be obtained by calling
get_fragmentname(3).
A value of zero for this field indicates that the field is defined in the
primary format file, the file called
format
in the root dirfile directory (see
dirfile(5)).
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.
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 */
const char *scalar[2]; /* parameter field codes */
gd_bit_t bitnum; /* first bit */
gd_bit_t numbits; /* bit length */
...
} gd_entry_t;
The
in_fields
member is an array of length one containing the input field code.
The
scalar
member is an array of length two containing the field codes specifying
bitnum
and
numbits,
or NULLs if numeric literal parameters were used.
The
bitnum
member indicates the number of the first bit (counted from zero) extracted from
the input. The
gd_bit_t
type is a signed 16-bit integer type. If this value was specified as a
CONST
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
CONST
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.
CONST Members
A gd_entry_t describing a CONST entry, will also provide:
typedef struct {
...
gd_type_t const_type; /* data type in format file */
...
} gd_entry_t;
The
const_type
member indicates the data type of the constant value stored in the format
file metadata. See
getdata(3)
for a list of valid values that a variable of type
gd_type_t
may take.
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 input fields */
int comp_scal; /* complex scalar flag */
const char *in_fields[GD_MAX_LINCOM]; /* input field code(s) */
const char *scalar[2 * GD_MAX_LINCOM]; /* param. field codes */
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, which is defined in getdata.h to the maximum number of input fields
permitted by a
LINCOM.
The
comp_scal
member is non-zero if any of the scale factors or offset terms have a non-zero
imaginary part. (That is, if comp_scal is zero, the elements of
cm~and~cb
equal the corresponding elements of
m~and~b.)
members.)
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
scalar
member is an array of length twice
GD_MAX_LINCOM
containing the field codes specifying the slope factors and offset terms for the
field, or NULLs if numberical literal parameters were used.
The first
GD_MAX_LINCOM
array elements contain the scale factors. The remaining
GD_MAX_LINCOM
array elements contain the offset terms. Array elements
scalar[i]
and
scalar[i
+
GD_MAX_LINCOM],
for
i~>=~n_fields,
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
CONST
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.
The
in_fields
member is an array of length one containing the input field code.
MULTIPLY Members
A gd_entry_t describing a MULTIPLY 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.
PHASE Members
A gd_entry_t describing a PHASE entry, will also provide:
typedef struct {
...
const char *in_fields[1]; /* input field code */
const char *scalar[1]; /* parameter field codes */
gd_shift_t shift; /* phase shift */
...
} gd_entry_t;
The
in_fields
member is an array of length one containing the input field code.
The
scalar
member is an array of length one containing the field code specifying
shift,
or NULL if a numeric literal parameter was used.
The
shift
member indicates the shift in samples. The
gd_shift_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
CONST
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 */
int comp_scal; /* complex scalar flag */
const char *in_fields[1]; /* input field code(s) */
const char *scalar[GD_MAX_POLY_ORD + 1];
/* co-eff. field codes */
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, which is defined in getdata.h to the maximum order of polynomial
permitted by a
POLYNOM.
The
comp_scal
member is non-zero if any of the co-efficients have a non-zero imaginary part.
(That is, if comp_scal is zero, the elements of
ca
equal the corresponding elements of
a.)
The
in_fields
member is an array of length one containing the input field code.
The
scalar
member is an array of length one more than
GD_MAX_POLYORD
containing the field codes specifying the co-efficients for the field, or NULLs
if numberical literal parameters were used.
Only the first
poly_ord
+ 1
elements are initialised. The remaining elements contain uninitialised data.
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
CONST
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 {
...
const char *scalar[1]; /* parameter field codes */
gd_spf_t spf; /* samples per frame on disk */
gd_type_t data_type; /* data type on disk */
...
} gd_entry_t;
The
scalar
member is an array of length one containing the field code specifying
spf,
or NULL if a numeric literal parameter was used.
The
spf
member contains the samples per frame of the binary data on disk. The
gd_spf_t
type is an unsigned 16-bit integer type. If this value was specified as a
CONST
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
getdata(3)
for a list of valid values that a variable of type
gd_type_t
may take.
STRING Members
A gd_entry_t describing a STRING entry provides no additional data.NOTES
When using the C89 GetData API (by defining GETDATA_C89_API before including getdata.h), the complex valued array members of gd_entry_t used in the specification of LINCOM and POLYNOM entries will be replaced by purely real arrays. These will have the prototypes such as:
double cm[GD_MAX_LINCOM][2]; double cb[GD_MAX_LINCOM][2]; double ca[GD_MAX_POLY_ORD + 1][2];The first element of the two element array is the real part of the complex number, and the second element is the imaginary part.
SEE ALSO
dirfile(5), dirfile_free_entry_strings(3), dirfile_open(3), getdata(3), get_error(3), get_error_string(3), get_field_list(3), get_fragmentname(3), get_raw_filename(3)