|
|
|
nvp_util
- Name/Value Pair UtilitiesThe NVP_UTIL package implements name/value pairs; i.e., binding a name to a value. A name/value pair is initially created without a value:
#include "nvp_util.h" -- Name/value pairs. NVPair pair ; ... nvpCreate ("pieceOfInfo", &pair) ;
An unbound pair can then be assigned values of different types:
#include "tv_util.h" -- UNIX timeval utilities. ... nvpAssign (pair, 1, NvpByte, 0x12) ; nvpAssign (pair, 1, NvpDouble, 123.45) ; nvpAssign (pair, 1, NvpLong, 678) ; nvpAssign (pair, 1, NvpTime, tvTOD ()) ;
The pairs above have all been assigned scalar values. Arrays of values can also be assigned to pairs:
#define MAX 50 double anArray[MAX] ; ... nvpAssign (pair, MAX, NvpDouble, anArray, NvpVolatile) ;
Strings are null-terminated, so no length needs to be specified:
nvpAssign (variable, -1, NvpString, "Hello", NvpStatic) ;
An application can specify the storage class of a string or array:
static, dynamic, or volatile. In the volatile example
above, the name/value pair variable is bound to a copy of the double
array; changes made to the bound array are not reflected in the original
array and the bound array is free(3)
ed when the name/value pair
is deleted. Dynamic values are assumed to have already been "copied" (e.g.,
a strdup(3)
ed string) and, like volatile values, will be
free(3)
ed when the name/value pair is deleted. In contrast,
a static value (e.g., the "Hello" string constant above, or a global variable)
exists independently of the name/value pair to which it is bound; the
name/value pair directly references the value and the value is not
free(3)
ed when the name/value pair is deleted.
A shorthand means of creating name/value pairs bound to scalars and volatile
strings is provided by nvpNew()
:
NVPair tic, tac, toe ; ... tic = nvpNew ("tic", NvpLong, 123) ; tac = nvpNew ("tac", NvpDouble, 4.56) ; toe = nvpNew ("toe", NvpString, "automatically duplicated") ;
Various attributes of a pair's value can be retrieved:
size_t elementSize = nvpSizeOf (variable) ; size_t numElements = nvpCount (variable) ; NvpDataType type = nvpTypeOf (variable) ;
A pointer to a pair's value is returned by nvpValue()
; the
application is responsible for casting the pointer to the correct data type
before dereferencing it:
#include <stdio.h> -- Standard I/O definitions. ... printf ("%s = %ld\n", nvpName (tic), *((long *) nvpValue (tic))) ; printf ("%s = %g\n", nvpName (tac), *((double *) nvpValue (tac))) ; printf ("%s = %s\n", nvpName (toe), (char *) nvpValue (toe)) ;
As with strings, an array value of any type is always returned as a pointer to the base of the array:
struct timeval *array ; static struct timeval tv[16] ; ... nvpAssign (pair, 16, NvpTime, tv, NvpStatic) ; nvpValue (pair) ; -- Returns &tv[0]
Finally, a name/value pair can be destroyed:
nvpDestroy (pair) ;
Depending on the storage class of the pair's value, the value may be
free(3)
ed by nvpDestroy()
.
The name/value pair, name/value list, and version-independent message stream packages were inspired by Mike Maloney's C++ implementations of named variables and named variable sets, and by Robert Martin's attributed data trees (see "Version-Independent Messages" in Appendix B of his Designing Object-Oriented C++ Applications Using the Booch Method).
nvpAssign()
- assigns a value to a name/value pair.
nvpCount()
- returns the number of elements in a pair's value.
nvpCreate()
- creates a name/value pair.
nvpDecode()
- creates a name/value pair from an ASCII specification.
nvpDestroy()
- destroys a name/value pair.
nvpEncode()
- returns the ASCII specification of a name/value pair.
nvpName()
- returns a variable's name.
nvpNew()
- creates a name/value pair with a value.
nvpSizeOf()
- returns the size of a scalar value or array element.
nvpTypeOf()
- returns the data type of a variable's value.
nvpValue()
- returns a variable's value.
xdr_NVPair()
- encodes/decodes a name/value pair in XDR format.
nvp_util.c
nvp_util.h
(See libnet
for the
complete source, including support routines and build files.)