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