4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright 1995, 1998 The Open Group
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPermission to use, copy, modify, distribute, and sell this software and its
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdocumentation for any purpose is hereby granted without fee, provided that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncthe above copyright notice appear in all copies and that both that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccopyright notice and this permission notice appear in supporting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdocumentation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe above copyright notice and this permission notice shall be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncincluded in all copies or substantial portions of the Software.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncOTHER DEALINGS IN THE SOFTWARE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExcept as contained in this notice, the name of The Open Group shall
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncnot be used in advertising or otherwise to promote the sale, use or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncother dealings in this Software without prior written authorization
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom The Open Group.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A Set Abstract Data Type (ADT) for the RECORD Extension
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync David P. Wiggins
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7/25/95
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The RECORD extension server code needs to maintain sets of numbers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that designate protocol message types. In most cases the interval of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync numbers starts at 0 and does not exceed 255, but in a few cases (minor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opcodes of extension requests) the maximum is 65535. This disparity
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync suggests that a single set representation may not be suitable for all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sets, especially given that server memory is precious. We introduce a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set ADT to hide implementation differences so that multiple
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simultaneous set representations can exist. A single interface is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync presented to the set user regardless of the implementation in use for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a particular set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The existing RECORD SI appears to require only four set operations:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync create (given a list of members), destroy, see if a particular number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is a member of the set, and iterate over the members of a set. Though
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync many more set operations are imaginable, to keep the code space down,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync we won't provide any more operations than are needed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The following types and functions/macros define the ADT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* an interval of set members */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CARD16 first;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CARD16 last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RecordSetInterval;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _RecordSetRec *RecordSetPtr; /* primary set type */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef void *RecordSetIteratePtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* table of function pointers for set operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set users should never declare a variable of this type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void (*DestroySet)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetPtr pSet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned long (*IsMemberOfSet)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetPtr pSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int possible_member
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetIteratePtr (*IterateSet)(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetPtr pSet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetIteratePtr pIter,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetInterval *interval
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RecordSetOperations;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* "base class" for sets.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set users should never declare a variable of this type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct _RecordSetRec {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetOperations *ops;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} RecordSetRec;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRecordSetPtr RecordCreateSet(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordSetInterval *intervals,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int nintervals,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *pMem,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int memsize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RecordCreateSet creates and returns a new set having members specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by intervals and nintervals. nintervals is the number of RecordSetInterval
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync structures pointed to by intervals. The elements belonging to the new
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set are determined as follows. For each RecordSetInterval structure, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync elements between first and last inclusive are members of the new set.
If a RecordSetInterval's first field is greater than its last field, the
results are undefined. It is valid to create an empty set (nintervals ==
0). If RecordCreateSet returns NULL, the set could not be created due
to resource constraints.
*/
int RecordSetMemoryRequirements(
RecordSetInterval * /*pIntervals*/,
int /*nintervals*/,
int * /*alignment*/
);
#define RecordDestroySet(_pSet) \
/* void */ (*_pSet->ops->DestroySet)(/* RecordSetPtr */ _pSet)
/*
RecordDestroySet frees all resources used by _pSet. _pSet should not be
used after it is destroyed.
*/
#define RecordIsMemberOfSet(_pSet, _m) \
/* unsigned long */ (*_pSet->ops->IsMemberOfSet)(/* RecordSetPtr */ _pSet, \
/* int */ _m)
/*
RecordIsMemberOfSet returns a non-zero value if _m is a member of
_pSet, else it returns zero.
*/
#define RecordIterateSet(_pSet, _pIter, _interval) \
/* RecordSetIteratePtr */ (*_pSet->ops->IterateSet)(/* RecordSetPtr */ _pSet,\
/* RecordSetIteratePtr */ _pIter, /* RecordSetInterval */ _interval)
/*
RecordIterateSet returns successive intervals of members of _pSet. If
_pIter is NULL, the first interval of set members is copied into _interval.
The return value should be passed as _pIter in the next call to
RecordIterateSet to obtain the next interval. When the return value is
NULL, there were no more intervals in the set, and nothing is copied into
the _interval parameter. Intervals appear in increasing numerical order
with no overlap between intervals. As such, the list of intervals produced
by RecordIterateSet may not match the list of intervals that were passed
in RecordCreateSet. Typical usage:
pIter = NULL;
while (pIter = RecordIterateSet(pSet, pIter, &interval))
{
process interval;
}
*/