Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nx-libs
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dimbor
nx-libs
Commits
eaae9610
Unverified
Commit
eaae9610
authored
Feb 27, 2018
by
Mihai Moldovan
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'uli42-pr/update_record' into 3.6.x
Attributes GH PR #649:
https://github.com/ArcticaProject/nx-libs/pull/649
parents
92d80639
e5833a6a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
76 additions
and
403 deletions
+76
-403
record.c
nx-X11/programs/Xserver/record/record.c
+50
-124
set.c
nx-X11/programs/Xserver/record/set.c
+26
-279
No files found.
nx-X11/programs/Xserver/record/record.c
View file @
eaae9610
...
...
@@ -41,6 +41,7 @@ and Jim Haggerty of Metheus.
#define _XRECORD_SERVER_
#include <nx-X11/extensions/recordstr.h>
#include "set.h"
#include "swaprep.h"
#include <stdio.h>
#include <assert.h>
...
...
@@ -201,8 +202,7 @@ static int numEnabledContexts;
* Side Effects: none.
*/
static
int
RecordFindContextOnAllContexts
(
pContext
)
RecordContextPtr
pContext
;
RecordFindContextOnAllContexts
(
RecordContextPtr
pContext
)
{
int
i
;
...
...
@@ -465,10 +465,7 @@ RecordFindClientOnContext(
* Note: this function exists mainly to make RecordARequest smaller.
*/
static
void
RecordABigRequest
(
pContext
,
client
,
stuff
)
RecordContextPtr
pContext
;
ClientPtr
client
;
xReq
*
stuff
;
RecordABigRequest
(
RecordContextPtr
pContext
,
ClientPtr
client
,
xReq
*
stuff
)
{
CARD32
bigLength
;
int
bytesLeft
;
...
...
@@ -516,8 +513,7 @@ RecordABigRequest(pContext, client, stuff)
* request for this client. The real Proc function is called.
*/
static
int
RecordARequest
(
client
)
ClientPtr
client
;
RecordARequest
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
RecordClientsAndProtocolPtr
pRCAP
;
...
...
@@ -600,10 +596,7 @@ RecordARequest(client)
* the word skip in ddx.tbl.ms (the porting layer document).
*/
static
void
RecordASkippedRequest
(
pcbl
,
nulldata
,
calldata
)
CallbackListPtr
*
pcbl
;
void
*
nulldata
;
void
*
calldata
;
RecordASkippedRequest
(
CallbackListPtr
*
pcbl
,
void
*
nulldata
,
void
*
calldata
)
{
SkippedRequestInfoRec
*
psi
=
(
SkippedRequestInfoRec
*
)
calldata
;
RecordContextPtr
pContext
;
...
...
@@ -690,10 +683,7 @@ RecordASkippedRequest(pcbl , nulldata, calldata)
* chunk of data belonging to this reply, it is set to 0.
*/
static
void
RecordAReply
(
pcbl
,
nulldata
,
calldata
)
CallbackListPtr
*
pcbl
;
void
*
nulldata
;
void
*
calldata
;
RecordAReply
(
CallbackListPtr
*
pcbl
,
void
*
nulldata
,
void
*
calldata
)
{
RecordContextPtr
pContext
;
RecordClientsAndProtocolPtr
pRCAP
;
...
...
@@ -775,10 +765,7 @@ RecordAReply(pcbl, nulldata, calldata)
* it for this client.
*/
static
void
RecordADeliveredEventOrError
(
pcbl
,
nulldata
,
calldata
)
CallbackListPtr
*
pcbl
;
void
*
nulldata
;
void
*
calldata
;
RecordADeliveredEventOrError
(
CallbackListPtr
*
pcbl
,
void
*
nulldata
,
void
*
calldata
)
{
EventInfoRec
*
pei
=
(
EventInfoRec
*
)
calldata
;
RecordContextPtr
pContext
;
...
...
@@ -797,13 +784,13 @@ RecordADeliveredEventOrError(pcbl, nulldata, calldata)
xEvent
*
pev
=
pei
->
events
;
for
(
ev
=
0
;
ev
<
pei
->
count
;
ev
++
,
pev
++
)
{
int
recordit
;
if
(
p
ev
->
u
.
u
.
type
==
X_Error
)
int
recordit
=
0
;
if
(
p
RCAP
->
pErrorSet
)
{
recordit
=
RecordIsMemberOfSet
(
pRCAP
->
pErrorSet
,
((
xError
*
)(
pev
))
->
errorCode
);
}
else
else
if
(
pRCAP
->
pDeliveredEventSet
)
{
recordit
=
RecordIsMemberOfSet
(
pRCAP
->
pDeliveredEventSet
,
pev
->
u
.
u
.
type
&
0177
);
...
...
@@ -844,10 +831,7 @@ RecordADeliveredEventOrError(pcbl, nulldata, calldata)
* it for this client.
*/
static
void
RecordADeviceEvent
(
pcbl
,
nulldata
,
calldata
)
CallbackListPtr
*
pcbl
;
void
*
nulldata
;
void
*
calldata
;
RecordADeviceEvent
(
CallbackListPtr
*
pcbl
,
void
*
nulldata
,
void
*
calldata
)
{
DeviceEventInfoRec
*
pei
=
(
DeviceEventInfoRec
*
)
calldata
;
RecordContextPtr
pContext
;
...
...
@@ -968,9 +952,7 @@ RecordFlushAllContexts(
* various callback lists.
*/
static
int
RecordInstallHooks
(
pRCAP
,
oneclient
)
RecordClientsAndProtocolPtr
pRCAP
;
XID
oneclient
;
RecordInstallHooks
(
RecordClientsAndProtocolPtr
pRCAP
,
XID
oneclient
)
{
int
i
=
0
;
XID
client
;
...
...
@@ -1063,9 +1045,7 @@ RecordInstallHooks(pRCAP, oneclient)
* various callback lists.
*/
static
void
RecordUninstallHooks
(
pRCAP
,
oneclient
)
RecordClientsAndProtocolPtr
pRCAP
;
XID
oneclient
;
RecordUninstallHooks
(
RecordClientsAndProtocolPtr
pRCAP
,
XID
oneclient
)
{
int
i
=
0
;
XID
client
;
...
...
@@ -1164,9 +1144,7 @@ RecordUninstallHooks(pRCAP, oneclient)
* have at least one client.)
*/
static
void
RecordDeleteClientFromRCAP
(
pRCAP
,
position
)
RecordClientsAndProtocolPtr
pRCAP
;
int
position
;
RecordDeleteClientFromRCAP
(
RecordClientsAndProtocolPtr
pRCAP
,
int
position
)
{
if
(
pRCAP
->
pContext
->
pRecordingClient
)
RecordUninstallHooks
(
pRCAP
,
pRCAP
->
pClientIDs
[
position
]);
...
...
@@ -1213,9 +1191,7 @@ RecordDeleteClientFromRCAP(pRCAP, position)
* is no more room to hold clients internal to the RCAP.
*/
static
void
RecordAddClientToRCAP
(
pRCAP
,
clientspec
)
RecordClientsAndProtocolPtr
pRCAP
;
XID
clientspec
;
RecordAddClientToRCAP
(
RecordClientsAndProtocolPtr
pRCAP
,
XID
clientspec
)
{
if
(
pRCAP
->
numClients
==
pRCAP
->
sizeClients
)
{
...
...
@@ -1261,9 +1237,7 @@ RecordAddClientToRCAP(pRCAP, clientspec)
* RCAP. (A given clientspec can only be on one RCAP of a context.)
*/
static
void
RecordDeleteClientFromContext
(
pContext
,
clientspec
)
RecordContextPtr
pContext
;
XID
clientspec
;
RecordDeleteClientFromContext
(
RecordContextPtr
pContext
,
XID
clientspec
)
{
RecordClientsAndProtocolPtr
pRCAP
;
int
position
;
...
...
@@ -1286,10 +1260,7 @@ RecordDeleteClientFromContext(pContext, clientspec)
* Side Effects: none.
*/
static
int
RecordSanityCheckClientSpecifiers
(
clientspecs
,
nspecs
,
errorspec
)
XID
*
clientspecs
;
int
nspecs
;
XID
errorspec
;
RecordSanityCheckClientSpecifiers
(
XID
*
clientspecs
,
int
nspecs
,
XID
errorspec
)
{
int
i
;
int
clientIndex
;
...
...
@@ -1348,10 +1319,7 @@ RecordSanityCheckClientSpecifiers(clientspecs, nspecs, errorspec)
* pClientspecs may be modified in place.
*/
static
XID
*
RecordCanonicalizeClientSpecifiers
(
pClientspecs
,
pNumClientspecs
,
excludespec
)
XID
*
pClientspecs
;
int
*
pNumClientspecs
;
XID
excludespec
;
RecordCanonicalizeClientSpecifiers
(
XID
*
pClientspecs
,
int
*
pNumClientspecs
,
XID
excludespec
)
{
int
i
;
int
numClients
=
*
pNumClientspecs
;
...
...
@@ -1448,10 +1416,7 @@ RecordPadAlign(int size, int align)
* Side Effects: none.
*/
static
int
RecordSanityCheckRegisterClients
(
pContext
,
client
,
stuff
)
RecordContextPtr
pContext
;
ClientPtr
client
;
xRecordRegisterClientsReq
*
stuff
;
RecordSanityCheckRegisterClients
(
RecordContextPtr
pContext
,
ClientPtr
client
,
xRecordRegisterClientsReq
*
stuff
)
{
int
err
;
xRecordRange
*
pRange
;
...
...
@@ -1586,9 +1551,7 @@ enum {REQ, /* set info for requests */
* RecordSetIntervals, all zeroed, and psi->size is set to size.
*/
static
int
RecordAllocIntervals
(
psi
,
nIntervals
)
SetInfoPtr
psi
;
int
nIntervals
;
RecordAllocIntervals
(
SetInfoPtr
psi
,
int
nIntervals
)
{
assert
(
!
psi
->
intervals
);
psi
->
intervals
=
(
RecordSetInterval
*
)
...
...
@@ -1710,10 +1673,7 @@ RecordConvertRangesToIntervals(
* to record the new clients and protocol.
*/
static
int
RecordRegisterClients
(
pContext
,
client
,
stuff
)
RecordContextPtr
pContext
;
ClientPtr
client
;
xRecordRegisterClientsReq
*
stuff
;
RecordRegisterClients
(
RecordContextPtr
pContext
,
ClientPtr
client
,
xRecordRegisterClientsReq
*
stuff
)
{
int
err
;
int
i
;
...
...
@@ -1986,8 +1946,7 @@ bailout:
*/
static
int
ProcRecordQueryVersion
(
client
)
ClientPtr
client
;
ProcRecordQueryVersion
(
ClientPtr
client
)
{
/* REQUEST(xRecordQueryVersionReq); */
xRecordQueryVersionReply
rep
;
...
...
@@ -2011,8 +1970,7 @@ ProcRecordQueryVersion(client)
static
int
ProcRecordCreateContext
(
client
)
ClientPtr
client
;
ProcRecordCreateContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordCreateContextReq
);
RecordContextPtr
pContext
;
...
...
@@ -2067,8 +2025,7 @@ bailout:
static
int
ProcRecordRegisterClients
(
client
)
ClientPtr
client
;
ProcRecordRegisterClients
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
REQUEST
(
xRecordRegisterClientsReq
);
...
...
@@ -2081,8 +2038,7 @@ ProcRecordRegisterClients(client)
static
int
ProcRecordUnregisterClients
(
client
)
ClientPtr
client
;
ProcRecordUnregisterClients
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
int
err
;
...
...
@@ -2146,9 +2102,7 @@ typedef struct {
* number of ranges. Newly allocated ranges are zeroed.
*/
static
int
RecordAllocRanges
(
pri
,
nRanges
)
GetContextRangeInfoPtr
pri
;
int
nRanges
;
RecordAllocRanges
(
GetContextRangeInfoPtr
pri
,
int
nRanges
)
{
int
newsize
;
xRecordRange
*
pNewRange
;
...
...
@@ -2308,9 +2262,7 @@ RecordConvertMinorOpInfoToRanges(
* The 16 bit fields of each xRecordRange are byte swapped.
*/
static
void
RecordSwapRanges
(
pRanges
,
nRanges
)
xRecordRange
*
pRanges
;
int
nRanges
;
RecordSwapRanges
(
xRecordRange
*
pRanges
,
int
nRanges
)
{
int
i
;
for
(
i
=
0
;
i
<
nRanges
;
i
++
,
pRanges
++
)
...
...
@@ -2324,8 +2276,7 @@ RecordSwapRanges(pRanges, nRanges)
static
int
ProcRecordGetContext
(
client
)
ClientPtr
client
;
ProcRecordGetContext
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
REQUEST
(
xRecordGetContextReq
);
...
...
@@ -2470,8 +2421,7 @@ bailout:
static
int
ProcRecordEnableContext
(
client
)
ClientPtr
client
;
ProcRecordEnableContext
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
REQUEST
(
xRecordEnableContextReq
);
...
...
@@ -2549,8 +2499,7 @@ ProcRecordEnableContext(client)
* is resumed.
*/
static
void
RecordDisableContext
(
pContext
)
RecordContextPtr
pContext
;
RecordDisableContext
(
RecordContextPtr
pContext
)
{
RecordClientsAndProtocolPtr
pRCAP
;
int
i
;
...
...
@@ -2587,8 +2536,7 @@ RecordDisableContext(pContext)
static
int
ProcRecordDisableContext
(
client
)
ClientPtr
client
;
ProcRecordDisableContext
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
REQUEST
(
xRecordDisableContextReq
);
...
...
@@ -2613,9 +2561,7 @@ ProcRecordDisableContext(client)
* it from the ppAllContexts array.
*/
static
int
RecordDeleteContext
(
value
,
id
)
void
*
value
;
XID
id
;
RecordDeleteContext
(
void
*
value
,
XID
id
)
{
int
i
;
RecordContextPtr
pContext
=
(
RecordContextPtr
)
value
;
...
...
@@ -2655,8 +2601,7 @@ RecordDeleteContext(value, id)
static
int
ProcRecordFreeContext
(
client
)
ClientPtr
client
;
ProcRecordFreeContext
(
ClientPtr
client
)
{
RecordContextPtr
pContext
;
REQUEST
(
xRecordFreeContextReq
);
...
...
@@ -2669,8 +2614,7 @@ ProcRecordFreeContext(client)
static
int
ProcRecordDispatch
(
client
)
ClientPtr
client
;
ProcRecordDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
...
...
@@ -2699,8 +2643,7 @@ ProcRecordDispatch(client)
static
int
SProcRecordQueryVersion
(
client
)
ClientPtr
client
;
SProcRecordQueryVersion
(
ClientPtr
client
)
{
REQUEST
(
xRecordQueryVersionReq
);
...
...
@@ -2737,8 +2680,7 @@ SwapCreateRegister(xRecordRegisterClientsReq *stuff)
static
int
SProcRecordCreateContext
(
client
)
ClientPtr
client
;
SProcRecordCreateContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordCreateContextReq
);
int
status
;
...
...
@@ -2752,8 +2694,7 @@ SProcRecordCreateContext(client)
static
int
SProcRecordRegisterClients
(
client
)
ClientPtr
client
;
SProcRecordRegisterClients
(
ClientPtr
client
)
{
REQUEST
(
xRecordRegisterClientsReq
);
int
status
;
...
...
@@ -2767,8 +2708,7 @@ SProcRecordRegisterClients(client)
static
int
SProcRecordUnregisterClients
(
client
)
ClientPtr
client
;
SProcRecordUnregisterClients
(
ClientPtr
client
)
{
REQUEST
(
xRecordUnregisterClientsReq
);
...
...
@@ -2782,8 +2722,7 @@ SProcRecordUnregisterClients(client)
static
int
SProcRecordGetContext
(
client
)
ClientPtr
client
;
SProcRecordGetContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordGetContextReq
);
...
...
@@ -2794,8 +2733,7 @@ SProcRecordGetContext(client)
}
/* SProcRecordGetContext */
static
int
SProcRecordEnableContext
(
client
)
ClientPtr
client
;
SProcRecordEnableContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordEnableContextReq
);
...
...
@@ -2807,8 +2745,7 @@ SProcRecordEnableContext(client)
static
int
SProcRecordDisableContext
(
client
)
ClientPtr
client
;
SProcRecordDisableContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordDisableContextReq
);
...
...
@@ -2820,8 +2757,7 @@ SProcRecordDisableContext(client)
static
int
SProcRecordFreeContext
(
client
)
ClientPtr
client
;
SProcRecordFreeContext
(
ClientPtr
client
)
{
REQUEST
(
xRecordFreeContextReq
);
...
...
@@ -2833,8 +2769,7 @@ SProcRecordFreeContext(client)
static
int
SProcRecordDispatch
(
client
)
ClientPtr
client
;
SProcRecordDispatch
(
ClientPtr
client
)
{
REQUEST
(
xReq
);
...
...
@@ -2861,9 +2796,6 @@ SProcRecordDispatch(client)
}
}
/* SProcRecordDispatch */
/* XXX goes in header file */
extern
void
SwapConnSetupInfo
(),
SwapConnSetupPrefix
();
/* RecordConnectionSetupInfo
*
* Arguments:
...
...
@@ -2877,20 +2809,18 @@ extern void SwapConnSetupInfo(), SwapConnSetupPrefix();
* The connection setup info is sent to the recording client.
*/
static
void
RecordConnectionSetupInfo
(
pContext
,
pci
)
RecordContextPtr
pContext
;
NewClientInfoRec
*
pci
;
RecordConnectionSetupInfo
(
RecordContextPtr
pContext
,
NewClientInfoRec
*
pci
)
{
int
prefixsize
=
SIZEOF
(
xConnSetupPrefix
);
int
restsize
=
pci
->
prefix
->
length
*
4
;
if
(
pci
->
client
->
swapped
)
{
char
*
pConnSetup
=
(
char
*
)
malloc
(
prefixsize
+
restsize
);
char
*
pConnSetup
=
(
char
*
)
malloc
(
prefixsize
+
restsize
);
if
(
!
pConnSetup
)
return
;
SwapConnSetupPrefix
(
pci
->
prefix
,
pConnSetup
);
SwapConnSetupInfo
(
pci
->
setup
,
pConnSetup
+
prefixsize
);
SwapConnSetupPrefix
(
pci
->
prefix
,
(
xConnSetupPrefix
*
)
pConnSetup
);
SwapConnSetupInfo
(
(
char
*
)
pci
->
setup
,
(
char
*
)(
pConnSetup
+
prefixsize
)
);
RecordAProtocolElement
(
pContext
,
pci
->
client
,
XRecordClientStarted
,
(
void
*
)
pConnSetup
,
prefixsize
+
restsize
,
0
);
free
(
pConnSetup
);
...
...
@@ -2932,10 +2862,7 @@ RecordConnectionSetupInfo(pContext, pci)
*/
static
void
RecordAClientStateChange
(
pcbl
,
nulldata
,
calldata
)
CallbackListPtr
*
pcbl
;
void
*
nulldata
;
void
*
calldata
;
RecordAClientStateChange
(
CallbackListPtr
*
pcbl
,
void
*
nulldata
,
void
*
calldata
)
{
NewClientInfoRec
*
pci
=
(
NewClientInfoRec
*
)
calldata
;
int
i
;
...
...
@@ -2998,8 +2925,7 @@ RecordAClientStateChange(pcbl, nulldata, calldata)
*
*/
static
void
RecordCloseDown
(
extEntry
)
ExtensionEntry
*
extEntry
;
RecordCloseDown
(
ExtensionEntry
*
extEntry
)
{
DeleteCallback
(
&
ClientStateCallback
,
RecordAClientStateChange
,
NULL
);
}
/* RecordCloseDown */
...
...
@@ -3015,7 +2941,7 @@ RecordCloseDown(extEntry)
* Enables the RECORD extension if possible.
*/
void
RecordExtensionInit
()
RecordExtensionInit
(
void
)
{
ExtensionEntry
*
extentry
;
...
...
nx-X11/programs/Xserver/record/set.c
View file @
eaae9610
/*
Copyright 1995, 1998 The Open Group
...
...
@@ -44,9 +43,6 @@ from The Open Group.
implemented, and RecordCreateSet will decide heuristically which one
to use based on the set members.
Note: When compiling for use in the server, do not use -DTESTING.
When compiling for stand-alone testing of the set ADT, use -DTESTING.
*/
#ifdef HAVE_DIX_CONFIG_H
...
...
@@ -55,34 +51,11 @@ from The Open Group.
#include <string.h>
#ifndef TESTING
#include "misc.h"
#else
#include <stdio.h>
#include <stdlib.h>
/* stuff that you normally get from the X Server's environment */
typedef
int
Bool
;
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
typedef
unsigned
short
CARD16
;
#ifndef max
#define max(_a, _b) ( ((_a) > (_b)) ? (_a) : (_b) )
#endif
#endif
/* TESTING */
#include "set.h"
static
int
maxMemberInInterval
(
pIntervals
,
nIntervals
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
maxMemberInInterval
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
)
{
int
i
;
int
maxMember
=
-
1
;
...
...
@@ -95,8 +68,7 @@ maxMemberInInterval(pIntervals, nIntervals)
}
static
void
NoopDestroySet
(
pSet
)
RecordSetPtr
pSet
;
NoopDestroySet
(
RecordSetPtr
pSet
)
{
}
...
...
@@ -113,16 +85,13 @@ typedef struct {
#define BITS_PER_LONG (sizeof(unsigned long) * 8)
static
void
BitVectorDestroySet
(
pSet
)
RecordSetPtr
pSet
;
BitVectorDestroySet
(
RecordSetPtr
pSet
)
{
free
(
pSet
);
}
static
unsigned
long
BitVectorIsMemberOfSet
(
pSet
,
pm
)
RecordSetPtr
pSet
;
int
pm
;
BitVectorIsMemberOfSet
(
RecordSetPtr
pSet
,
int
pm
)
{
BitVectorSetPtr
pbvs
=
(
BitVectorSetPtr
)
pSet
;
unsigned
long
*
pbitvec
;
...
...
@@ -134,10 +103,7 @@ BitVectorIsMemberOfSet(pSet, pm)
static
int
BitVectorFindBit
(
pSet
,
iterbit
,
bitval
)
RecordSetPtr
pSet
;
int
iterbit
;
Bool
bitval
;
BitVectorFindBit
(
RecordSetPtr
pSet
,
int
iterbit
,
Bool
bitval
)
{
BitVectorSetPtr
pbvs
=
(
BitVectorSetPtr
)
pSet
;
unsigned
long
*
pbitvec
=
(
unsigned
long
*
)(
&
pbvs
[
1
]);
...
...
@@ -183,10 +149,8 @@ BitVectorFindBit(pSet, iterbit, bitval)
static
RecordSetIteratePtr
BitVectorIterateSet
(
pSet
,
pIter
,
pInterval
)
RecordSetPtr
pSet
;
RecordSetIteratePtr
pIter
;
RecordSetInterval
*
pInterval
;
BitVectorIterateSet
(
RecordSetPtr
pSet
,
RecordSetIteratePtr
pIter
,
RecordSetInterval
*
pInterval
)
{
int
iterbit
=
(
int
)(
long
)
pIter
;
int
b
;
...
...
@@ -200,18 +164,15 @@ BitVectorIterateSet(pSet, pIter, pInterval)
return
(
RecordSetIteratePtr
)(
long
)(
pInterval
->
last
+
1
);
}
RecordSetOperations
BitVectorSetOperations
=
{
static
RecordSetOperations
BitVectorSetOperations
=
{
BitVectorDestroySet
,
BitVectorIsMemberOfSet
,
BitVectorIterateSet
};
RecordSetOperations
BitVectorNoFreeOperations
=
{
static
RecordSetOperations
BitVectorNoFreeOperations
=
{
NoopDestroySet
,
BitVectorIsMemberOfSet
,
BitVectorIterateSet
};
static
int
BitVectorSetMemoryRequirements
(
pIntervals
,
nIntervals
,
maxMember
,
alignment
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
int
maxMember
;
int
*
alignment
;
BitVectorSetMemoryRequirements
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
int
maxMember
,
int
*
alignment
)
{
int
nlongs
;
...
...
@@ -221,11 +182,8 @@ BitVectorSetMemoryRequirements(pIntervals, nIntervals, maxMember, alignment)
}
static
RecordSetPtr
BitVectorCreateSet
(
pIntervals
,
nIntervals
,
pMem
,
memsize
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
void
*
pMem
;
int
memsize
;
BitVectorCreateSet
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
void
*
pMem
,
int
memsize
)
{
BitVectorSetPtr
pbvs
;
int
i
,
j
;
...
...
@@ -273,16 +231,13 @@ typedef struct {
}
IntervalListSet
,
*
IntervalListSetPtr
;
static
void
IntervalListDestroySet
(
pSet
)
RecordSetPtr
pSet
;
IntervalListDestroySet
(
RecordSetPtr
pSet
)
{
free
(
pSet
);
}
static
unsigned
long
IntervalListIsMemberOfSet
(
pSet
,
pm
)
RecordSetPtr
pSet
;
int
pm
;
IntervalListIsMemberOfSet
(
RecordSetPtr
pSet
,
int
pm
)
{
IntervalListSetPtr
prls
=
(
IntervalListSetPtr
)
pSet
;
RecordSetInterval
*
pInterval
=
(
RecordSetInterval
*
)(
&
prls
[
1
]);
...
...
@@ -302,10 +257,8 @@ IntervalListIsMemberOfSet(pSet, pm)
static
RecordSetIteratePtr
IntervalListIterateSet
(
pSet
,
pIter
,
pIntervalReturn
)
RecordSetPtr
pSet
;
RecordSetIteratePtr
pIter
;
RecordSetInterval
*
pIntervalReturn
;
IntervalListIterateSet
(
RecordSetPtr
pSet
,
RecordSetIteratePtr
pIter
,
RecordSetInterval
*
pIntervalReturn
)
{
RecordSetInterval
*
pInterval
=
(
RecordSetInterval
*
)
pIter
;
IntervalListSetPtr
prls
=
(
IntervalListSetPtr
)
pSet
;
...
...
@@ -324,29 +277,23 @@ IntervalListIterateSet(pSet, pIter, pIntervalReturn)
return
(
RecordSetIteratePtr
)
NULL
;
}
RecordSetOperations
IntervalListSetOperations
=
{
static
RecordSetOperations
IntervalListSetOperations
=
{
IntervalListDestroySet
,
IntervalListIsMemberOfSet
,
IntervalListIterateSet
};
RecordSetOperations
IntervalListNoFreeOperations
=
{
static
RecordSetOperations
IntervalListNoFreeOperations
=
{
NoopDestroySet
,
IntervalListIsMemberOfSet
,
IntervalListIterateSet
};
static
int
IntervalListMemoryRequirements
(
pIntervals
,
nIntervals
,
maxMember
,
alignment
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
int
maxMember
;
int
*
alignment
;
IntervalListMemoryRequirements
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
int
maxMember
,
int
*
alignment
)
{
*
alignment
=
sizeof
(
unsigned
long
);
return
sizeof
(
IntervalListSet
)
+
nIntervals
*
sizeof
(
RecordSetInterval
);
}
static
RecordSetPtr
IntervalListCreateSet
(
pIntervals
,
nIntervals
,
pMem
,
memsize
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
void
*
pMem
;
int
memsize
;
IntervalListCreateSet
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
void
*
pMem
,
int
memsize
)
{
IntervalListSetPtr
prls
;
int
i
,
j
,
k
;
...
...
@@ -417,20 +364,6 @@ bailout:
return
(
RecordSetPtr
)
prls
;
}
#ifdef TESTING
typedef
enum
{
BitVectorImplementation
,
IntervalListImplementation
}
RecordSetImplementation
;
RecordSetImplementation
_RecordSetImpl
;
static
void
_RecordForceSetImplementation
(
setimpl
)
RecordSetImplementation
setimpl
;
{
_RecordSetImpl
=
setimpl
;
}
#endif
typedef
RecordSetPtr
(
*
RecordCreateSetProcPtr
)(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
...
...
@@ -439,11 +372,9 @@ typedef RecordSetPtr (*RecordCreateSetProcPtr)(
);
static
int
_RecordSetMemoryRequirements
(
pIntervals
,
nIntervals
,
alignment
,
ppCreateSet
)
RecordSetInterval
*
pIntervals
;
int
nIntervals
;
int
*
alignment
;
RecordCreateSetProcPtr
*
ppCreateSet
;
_RecordSetMemoryRequirements
(
RecordSetInterval
*
pIntervals
,
int
nIntervals
,
int
*
alignment
,
RecordCreateSetProcPtr
*
ppCreateSet
)
{
int
bmsize
,
rlsize
,
bma
,
rla
;
int
maxMember
;
...
...
@@ -455,12 +386,8 @@ _RecordSetMemoryRequirements(pIntervals, nIntervals, alignment, ppCreateSet)
&
bma
);
rlsize
=
IntervalListMemoryRequirements
(
pIntervals
,
nIntervals
,
maxMember
,
&
rla
);
#ifdef TESTING
if
(
_RecordSetImpl
==
BitVectorImplementation
)
#else
if
(
(
(
nIntervals
>
1
)
&&
(
maxMember
<=
255
)
)
||
(
bmsize
<
rlsize
)
)
#endif
{
*
alignment
=
bma
;
*
ppCreateSet
=
BitVectorCreateSet
;
...
...
@@ -509,183 +436,3 @@ RecordCreateSet(pIntervals, nIntervals, pMem, memsize)
}
return
(
*
pCreateSet
)(
pIntervals
,
nIntervals
,
pMem
,
size
);
}
/***************************************************************************/
#ifdef TESTING
/*
Test Strategy
Having two set representations is convenient for testing because we
can play them against each other. The test code will be able to
specify which implementation to use. This breaks the encapsulation,
but that seems acceptable for testing. The crux of the test loop
looks like this:
loop:
generate random list of Intervals
create set A using bit vector implementation
create set B using Interval list implementation
for each possible set member
if set A and set B disagree on whether this is a member error;
iterate over both sets, comparing the intervals returned by each.
if intervals or number of intervals are different error;
iterate over intervals of set A
for i = interval.first to interval.last
if i is not a member of set B error;
iterate over intervals of set B
for i = interval.first to interval.last
if i is not a member of set A error;
destroy sets A, B
*/
int
GenerateRandomIntervals
(
pIntervals
,
maxintervals
)
RecordSetInterval
*
pIntervals
;
int
maxintervals
;
{
int
i
,
nIntervals
;
nIntervals
=
rand
()
%
maxintervals
;
for
(
i
=
0
;
i
<
nIntervals
;
i
++
)
{
pIntervals
[
i
].
first
=
rand
();
pIntervals
[
i
].
last
=
pIntervals
[
i
].
first
+
rand
();
}
return
nIntervals
;
}
#define MAXINTERVALS 100
int
main
(
argc
,
argv
)
int
argc
;
char
**
argv
;
{
RecordSetPtr
bs
,
rs
;
RecordSetInterval
br
,
rr
;
RecordSetIteratePtr
bi
,
ri
;
CARD16
i
;
int
testcount
;
RecordSetInterval
intervals
[
MAXINTERVALS
];
int
nIntervals
;
int
bsize
,
rsize
;
int
balign
,
ralign
;
int
pad
;
for
(
testcount
=
0
;
1
;
testcount
++
)
{
nIntervals
=
GenerateRandomIntervals
(
intervals
,
MAXINTERVALS
);
printf
(
"%d nIntervals %d
\n
"
,
testcount
,
nIntervals
);
if
(
testcount
&
1
)
{
_RecordForceSetImplementation
(
BitVectorImplementation
);
bsize
=
RecordSetMemoryRequirements
(
intervals
,
nIntervals
,
&
balign
);
_RecordForceSetImplementation
(
IntervalListImplementation
);
rsize
=
RecordSetMemoryRequirements
(
intervals
,
nIntervals
,
&
ralign
);
pad
=
(
ralign
-
(
bsize
&
(
ralign
-
1
)))
&
(
ralign
-
1
);
bs
=
(
RecordSetPtr
)
malloc
(
bsize
+
pad
+
rsize
);
if
(
!
bs
)
{
fprintf
(
stderr
,
"%d: failed to alloc memory for sets
\n
"
,
testcount
);
continue
;
}
rs
=
(
RecordSetPtr
)(((
char
*
)
bs
)
+
bsize
+
pad
);
}
else
{
bs
=
rs
=
NULL
;
bsize
=
rsize
=
0
;
}
_RecordForceSetImplementation
(
BitVectorImplementation
);
bs
=
RecordCreateSet
(
intervals
,
nIntervals
,
bs
,
bsize
);
_RecordForceSetImplementation
(
IntervalListImplementation
);
rs
=
RecordCreateSet
(
intervals
,
nIntervals
,
rs
,
rsize
);
if
(
!
bs
||
!
rs
)
{
fprintf
(
stderr
,
"%d: failed to create sets
\n
"
,
testcount
);
continue
;
}
for
(
i
=
0
;
i
<
65535
;
i
++
)
{
unsigned
long
b
,
r
;
b
=
RecordIsMemberOfSet
(
bs
,
i
);
r
=
RecordIsMemberOfSet
(
rs
,
i
);
if
(
(
b
&&
!
r
)
||
(
!
b
&&
r
)
)
{
fprintf
(
stderr
,
"%d: isMemberOfSet %d
\n
"
,
testcount
,
(
int
)
i
);
}
}
bi
=
RecordIterateSet
(
bs
,
NULL
,
&
br
);
ri
=
RecordIterateSet
(
rs
,
NULL
,
&
rr
);
while
(
bi
&&
ri
)
{
if
(
(
rr
.
first
!=
br
.
first
)
||
(
rr
.
last
!=
br
.
last
)
)
{
fprintf
(
stderr
,
"%d: iterateSet interval value mismatch
\n
"
,
testcount
);
}
bi
=
RecordIterateSet
(
bs
,
bi
,
&
br
);
ri
=
RecordIterateSet
(
rs
,
ri
,
&
rr
);
}
if
(
bi
!=
ri
)
{
fprintf
(
stderr
,
"%d: iterateSet interval count mismatch
\n
"
,
testcount
);
}
bi
=
NULL
;
while
(
bi
=
RecordIterateSet
(
bs
,
bi
,
&
br
))
{
for
(
i
=
br
.
first
;
i
<=
br
.
last
;
i
++
)
{
if
(
!
RecordIsMemberOfSet
(
rs
,
i
))
{
fprintf
(
stderr
,
"%d: iterateSet b / isMemberOfSet r %d
\n
"
,
testcount
,
(
int
)
i
);
}
}
}
ri
=
NULL
;
while
(
ri
=
RecordIterateSet
(
rs
,
ri
,
&
rr
))
{
for
(
i
=
rr
.
first
;
i
<=
rr
.
last
;
i
++
)
{
if
(
!
RecordIsMemberOfSet
(
bs
,
i
)
)
{
fprintf
(
stderr
,
"%d: iterateSet r / isMemberOfSet b %d
\n
"
,
testcount
,
(
int
)
i
);
}
}
}
RecordDestroySet
(
bs
);
RecordDestroySet
(
rs
);
if
(
testcount
&
1
)
{
free
(
bs
);
}
}
}
#endif
/* TESTING */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment