#include "PEXlib.h"
#include "PEXlibint.h"
#include "pl_oc_util.h"
PEXStructure
PEXCreateStructure (display)
INPUT Display *display;
{
register pexCreateStructureReq *req;
char *pBuf;
PEXStructure sid;
sid = XAllocID (display);
LockDisplay (display);
PEXGetReq (CreateStructure, pBuf);
BEGIN_REQUEST_HEADER (CreateStructure, pBuf, req);
PEXStoreReqHead (CreateStructure, req);
req->id = sid;
END_REQUEST_HEADER (CreateStructure, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
return (sid);
}
void
PEXDestroyStructures (display, numStructures, structures)
INPUT Display *display;
INPUT unsigned long numStructures;
INPUT PEXStructure *structures;
{
register pexDestroyStructuresReq *req;
char *pBuf;
int size;
LockDisplay (display);
size = numStructures * SIZEOF (pexStructure);
PEXGetReqExtra (DestroyStructures, size, pBuf);
BEGIN_REQUEST_HEADER (DestroyStructures, pBuf, req);
PEXStoreReqExtraHead (DestroyStructures, size, req);
req->numStructures = numStructures;
END_REQUEST_HEADER (DestroyStructures, pBuf, req);
STORE_LISTOF_CARD32 (numStructures, structures, pBuf);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXCopyStructure (display, srcStructure, destStructure)
INPUT Display *display;
INPUT PEXStructure srcStructure;
INPUT PEXStructure destStructure;
{
register pexCopyStructureReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (CopyStructure, pBuf);
BEGIN_REQUEST_HEADER (CopyStructure, pBuf, req);
PEXStoreReqHead (CopyStructure, req);
req->src = srcStructure;
req->dst = destStructure;
END_REQUEST_HEADER (CopyStructure, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
Status
PEXGetStructureInfo (display, structure, float_format,
value_mask, info_return)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int float_format;
INPUT unsigned long value_mask;
OUTPUT PEXStructureInfo *info_return;
{
register pexGetStructureInfoReq *req;
char *pBuf;
pexGetStructureInfoReply rep;
LockDisplay (display);
PEXGetReq (GetStructureInfo, pBuf);
BEGIN_REQUEST_HEADER (GetStructureInfo, pBuf, req);
PEXStoreReqHead (GetStructureInfo, req);
req->fpFormat = float_format;
req->sid = structure;
req->itemMask = value_mask;
END_REQUEST_HEADER (GetStructureInfo, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xTrue) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
return (0);
}
if (value_mask & PEXEditMode)
info_return->edit_mode = rep.editMode;
if (value_mask & PEXElementPtr)
info_return->element_pointer = rep.elementPtr;
if (value_mask & PEXNumElements)
info_return->element_count = rep.numElements;
if (value_mask & PEXLengthStructure)
info_return->size = rep.lengthStructure;
if (value_mask & PEXHasRefs)
info_return->has_refs = rep.hasRefs;
UnlockDisplay (display);
PEXSyncHandle (display);
return (1);
}
Status
PEXGetElementInfo (display, structure, whence1, offset1, whence2, offset2,
float_format, numElementInfoReturn, infoReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence1;
INPUT long offset1;
INPUT int whence2;
INPUT long offset2;
INPUT int float_format;
OUTPUT unsigned long *numElementInfoReturn;
OUTPUT PEXElementInfo **infoReturn;
{
register pexGetElementInfoReq *req;
char *pBuf;
pexGetElementInfoReply rep;
LockDisplay (display);
PEXGetReq (GetElementInfo, pBuf);
BEGIN_REQUEST_HEADER (GetElementInfo, pBuf, req);
PEXStoreReqHead (GetElementInfo, req);
req->fpFormat = float_format;
req->sid = structure;
req->position1_whence = whence1;
req->position1_offset = offset1;
req->position2_whence = whence2;
req->position2_offset = offset2;
END_REQUEST_HEADER (GetElementInfo, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*numElementInfoReturn = 0;
*infoReturn = NULL;
return (0);
}
*numElementInfoReturn = rep.numInfo;
*infoReturn = (PEXElementInfo *) Xmalloc (
(unsigned) (sizeof (PEXElementInfo) * rep.numInfo));
XREAD_LISTOF_ELEMINFO (display, rep.numInfo, (*infoReturn));
UnlockDisplay (display);
PEXSyncHandle (display);
return (1);
}
PEXStructure *
PEXGetStructuresInNetwork (display, structure, which, numStructuresReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int which;
OUTPUT unsigned long *numStructuresReturn;
{
register pexGetStructuresInNetworkReq *req;
char *pBuf;
pexGetStructuresInNetworkReply rep;
PEXStructure *structsRet;
LockDisplay (display);
PEXGetReq (GetStructuresInNetwork, pBuf);
BEGIN_REQUEST_HEADER (GetStructuresInNetwork, pBuf, req);
PEXStoreReqHead (GetStructuresInNetwork, req);
req->sid = structure;
req->which = which;
END_REQUEST_HEADER (GetStructuresInNetwork, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*numStructuresReturn = 0;
return (NULL);
}
*numStructuresReturn = rep.numStructures;
structsRet = (PEXStructure *) Xmalloc (
(unsigned) (sizeof (PEXStructure) * rep.numStructures));
XREAD_LISTOF_CARD32 (display, rep.numStructures, structsRet);
UnlockDisplay (display);
PEXSyncHandle (display);
return (structsRet);
}
PEXStructurePath *
PEXGetAncestors (display, structure, pathPart, pathDepth, numPathsReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int pathPart;
INPUT unsigned long pathDepth;
OUTPUT unsigned long *numPathsReturn;
{
register pexGetAncestorsReq *req;
char *pBuf, *pBufSave;
pexGetAncestorsReply rep;
PEXStructurePath *pStrucPath;
PEXElementRef *pElemRef;
int numElements;
int i;
LockDisplay (display);
PEXGetReq (GetAncestors, pBuf);
BEGIN_REQUEST_HEADER (GetAncestors, pBuf, req);
PEXStoreReqHead (GetAncestors, req);
req->sid = structure;
req->pathOrder = pathPart;
req->pathDepth = pathDepth;
END_REQUEST_HEADER (GetAncestors, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*numPathsReturn = 0;
return (NULL);
}
*numPathsReturn = rep.numPaths;
XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
pBuf = pBufSave;
pStrucPath = (PEXStructurePath *) Xmalloc (
(unsigned) (rep.numPaths * sizeof (PEXStructurePath)));
for (i = 0; i < rep.numPaths; i++)
{
EXTRACT_CARD32 (pBuf, numElements);
pElemRef = (PEXElementRef *) Xmalloc (
(unsigned) (numElements * sizeof (PEXElementRef)));
EXTRACT_LISTOF_ELEMREF (numElements, pBuf, pElemRef);
pStrucPath[i].count = numElements;
pStrucPath[i].elements = pElemRef;
}
FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
UnlockDisplay (display);
PEXSyncHandle (display);
return (pStrucPath);
}
PEXStructurePath *
PEXGetDescendants (display, structure, pathPart, pathDepth, numPathsReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int pathPart;
INPUT unsigned long pathDepth;
OUTPUT unsigned long *numPathsReturn;
{
register pexGetDescendantsReq *req;
char *pBuf, *pBufSave;
pexGetDescendantsReply rep;
PEXStructurePath *pStrucPath;
PEXElementRef *pElemRef;
int numElements;
int i;
LockDisplay (display);
PEXGetReq (GetDescendants, pBuf);
BEGIN_REQUEST_HEADER (GetDescendants, pBuf, req);
PEXStoreReqHead (GetDescendants, req);
req->sid = structure;
req->pathOrder = pathPart;
req->pathDepth = pathDepth;
END_REQUEST_HEADER (GetDescendants, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*numPathsReturn = 0;
return (NULL);
}
*numPathsReturn = rep.numPaths;
XREAD_INTO_SCRATCH (display, pBufSave, rep.length << 2);
pBuf = pBufSave;
pStrucPath = (PEXStructurePath *) Xmalloc (
(unsigned) (rep.numPaths * sizeof (PEXStructurePath)));
for (i = 0; i < rep.numPaths; i++)
{
EXTRACT_CARD32 (pBuf, numElements);
pElemRef = (PEXElementRef *) Xmalloc (
(unsigned) (numElements * sizeof (PEXElementRef)));
EXTRACT_LISTOF_ELEMREF (numElements, pBuf, pElemRef);
pStrucPath[i].count = numElements;
pStrucPath[i].elements = pElemRef;
}
FINISH_WITH_SCRATCH (display, pBufSave, rep.length << 2);
UnlockDisplay (display);
PEXSyncHandle (display);
return (pStrucPath);
}
Status
PEXFetchElements (display, structure, whence1, offset1, whence2, offset2,
float_format, numElementsReturn, sizeReturn, ocsReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence1;
INPUT long offset1;
INPUT int whence2;
INPUT long offset2;
INPUT int float_format;
OUTPUT unsigned long *numElementsReturn;
OUTPUT unsigned long *sizeReturn;
OUTPUT char **ocsReturn;
{
register pexFetchElementsReq *req;
char *pBuf;
pexFetchElementsReply rep;
long repSize;
PEXOCData *oc_data;
int server_float_format;
LockDisplay (display);
server_float_format = PEXGetProtocolFloatFormat (display);
PEXGetReq (FetchElements, pBuf);
BEGIN_REQUEST_HEADER (FetchElements, pBuf, req);
PEXStoreReqHead (FetchElements, req);
req->fpFormat = server_float_format;
req->sid = structure;
req->position1_whence = whence1;
req->position1_offset = offset1;
req->position2_whence = whence2;
req->position2_offset = offset2;
END_REQUEST_HEADER (FetchElements, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*sizeReturn = *numElementsReturn = 0;
*ocsReturn = NULL;
return (0);
}
*numElementsReturn = rep.numElements;
if (server_float_format != float_format)
{
XREAD_INTO_SCRATCH (display, pBuf, rep.length << 2);
oc_data = PEXDecodeOCs (server_float_format, rep.numElements,
rep.length << 2, pBuf);
FINISH_WITH_SCRATCH (display, pBuf, rep.length << 2);
*ocsReturn = PEXEncodeOCs (float_format, rep.numElements,
oc_data, sizeReturn);
PEXFreeOCData (rep.numElements, oc_data);
}
else
{
*sizeReturn = repSize = rep.length << 2;
if ((*ocsReturn = (char *) Xmalloc ((unsigned) repSize)))
_XRead (display, *ocsReturn, (long) repSize);
}
UnlockDisplay (display);
PEXSyncHandle (display);
return (1);
}
Status
PEXFetchElementsAndSend (display, structure,
whence1, offset1, whence2, offset2, dstDisplay, resID, reqType)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence1;
INPUT long offset1;
INPUT int whence2;
INPUT long offset2;
INPUT Display *dstDisplay;
INPUT XID resID;
INPUT PEXOCRequestType reqType;
{
register pexFetchElementsReq *req;
char *pBuf;
pexFetchElementsReply rep;
PEXDisplayInfo *srcDisplayInfo;
PEXDisplayInfo *dstDisplayInfo;
char *ocAddr;
PEXOCData *oc_data;
PEXEnumTypeDesc *srcFloats;
PEXEnumTypeDesc *dstFloats;
long bytesLeft;
int getSize;
int size;
unsigned long oc_size;
int i, j;
int fp_match;
int float_format;
LockDisplay (display);
PEXGetDisplayInfo (display, srcDisplayInfo);
PEXGetDisplayInfo (dstDisplay, dstDisplayInfo);
if (srcDisplayInfo->fpFormat == dstDisplayInfo->fpFormat)
{
float_format = dstDisplayInfo->fpFormat;
fp_match = 1;
}
else
{
srcFloats = srcDisplayInfo->fpSupport;
dstFloats = dstDisplayInfo->fpSupport;
fp_match = 0;
for (i = 0; i < dstDisplayInfo->fpCount && !fp_match; i++)
for (j = 0; j < srcDisplayInfo->fpCount; j++)
{
if (dstFloats[i].index == srcFloats[j].index)
{
float_format = dstFloats[i].index;
fp_match = 1;
break;
}
}
if (!fp_match)
{
float_format = srcDisplayInfo->fpFormat;
}
}
PEXGetReq (FetchElements, pBuf);
BEGIN_REQUEST_HEADER (FetchElements, pBuf, req);
PEXStoreReqHead (FetchElements, req);
req->fpFormat = float_format;
req->sid = structure;
req->position1_whence = whence1;
req->position1_offset = offset1;
req->position2_whence = whence2;
req->position2_offset = offset2;
END_REQUEST_HEADER (FetchElements, pBuf, req);
if (_XReply (display, (xReply *)&rep, 0, xFalse) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
return (0);
}
if (fp_match)
{
if (display == dstDisplay)
UnlockDisplay (display);
if (PEXStartOCs (dstDisplay, resID, reqType, float_format,
rep.numElements, rep.length))
{
bytesLeft = rep.length << 2;
getSize = PEXGetOCAddrMaxSize (dstDisplay);
while (bytesLeft > 0)
{
size = bytesLeft < getSize ? bytesLeft : getSize;
ocAddr = PEXGetOCAddr (dstDisplay, size);
_XRead (display, ocAddr, (long) size);
bytesLeft -= size;
}
PEXFinishOCs (dstDisplay);
}
if (display != dstDisplay)
UnlockDisplay (display);
}
else
{
XREAD_INTO_SCRATCH (display, pBuf, rep.length << 2);
oc_data = PEXDecodeOCs (float_format, rep.numElements,
rep.length << 2, pBuf);
FINISH_WITH_SCRATCH (display, pBuf, rep.length << 2);
pBuf = PEXEncodeOCs (dstDisplayInfo->fpFormat, rep.numElements,
oc_data, &oc_size);
PEXFreeOCData (rep.numElements, oc_data);
if (display == dstDisplay)
UnlockDisplay (display);
PEXSendOCs (dstDisplay, resID, reqType, dstDisplayInfo->fpFormat,
rep.numElements, oc_size, pBuf);
if (display != dstDisplay)
UnlockDisplay (display);
}
PEXSyncHandle (dstDisplay);
return (1);
}
void
PEXSetEditingMode (display, structure, mode)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int mode;
{
register pexSetEditingModeReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (SetEditingMode, pBuf);
BEGIN_REQUEST_HEADER (SetEditingMode, pBuf, req);
PEXStoreReqHead (SetEditingMode, req);
req->sid = structure;
req->mode = mode;
END_REQUEST_HEADER (SetEditingMode, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXSetElementPtr (display, structure, whence, offset)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence;
INPUT long offset;
{
register pexSetElementPointerReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (SetElementPointer, pBuf);
BEGIN_REQUEST_HEADER (SetElementPointer, pBuf, req);
PEXStoreReqHead (SetElementPointer, req);
req->sid = structure;
req->position_whence = whence;
req->position_offset = offset;
END_REQUEST_HEADER (SetElementPointer, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXSetElementPtrAtLabel (display, structure, label, offset)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT long label;
INPUT long offset;
{
register pexSetElementPointerAtLabelReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (SetElementPointerAtLabel, pBuf);
BEGIN_REQUEST_HEADER (SetElementPointerAtLabel, pBuf, req);
PEXStoreReqHead (SetElementPointerAtLabel, req);
req->sid = structure;
req->label = label;
req->offset = offset;
END_REQUEST_HEADER (SetElementPointerAtLabel, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
Status
PEXElementSearch (display, structure, whence, offset, direction,
numIncl, inclList, numExcl, exclList, offsetReturn)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence;
INPUT long offset;
INPUT int direction;
INPUT unsigned long numIncl;
INPUT unsigned short *inclList;
INPUT unsigned long numExcl;
INPUT unsigned short *exclList;
OUTPUT unsigned long *offsetReturn;
{
register pexElementSearchReq *req;
char *pBuf;
pexElementSearchReply rep;
int size;
LockDisplay (display);
size = SIZEOF (CARD16) *
(numIncl + (numIncl & 1) + numExcl + (numExcl & 1));
PEXGetReqExtra (ElementSearch, size, pBuf);
BEGIN_REQUEST_HEADER (ElementSearch, pBuf, req);
PEXStoreReqExtraHead (ElementSearch, size, req);
req->sid = structure;
req->position_whence = whence;
req->position_offset = offset;
req->direction = direction;
req->numIncls = numIncl;
req->numExcls = numExcl;
END_REQUEST_HEADER (ElementSearch, pBuf, req);
STORE_LISTOF_CARD16 (numIncl, inclList, pBuf);
pBuf += ((numIncl & 1) * SIZEOF (CARD16));
STORE_LISTOF_CARD16 (numExcl, exclList, pBuf);
if (_XReply (display, (xReply *)&rep, 0, xTrue) == 0)
{
UnlockDisplay (display);
PEXSyncHandle (display);
*offsetReturn = 0;
return (0);
}
*offsetReturn = rep.foundOffset;
UnlockDisplay (display);
PEXSyncHandle (display);
return (rep.status);
}
void
PEXDeleteElements (display, structure, whence1, offset1, whence2, offset2)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence1;
INPUT long offset1;
INPUT int whence2;
INPUT long offset2;
{
register pexDeleteElementsReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (DeleteElements, pBuf);
BEGIN_REQUEST_HEADER (DeleteElements, pBuf, req);
PEXStoreReqHead (DeleteElements, req);
req->sid = structure;
req->position1_whence = whence1;
req->position1_offset = offset1;
req->position2_whence = whence2;
req->position2_offset = offset2;
END_REQUEST_HEADER (DeleteElements, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXDeleteToLabel (display, structure, whence, offset, label)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT int whence;
INPUT long offset;
INPUT long label;
{
register pexDeleteElementsToLabelReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (DeleteElementsToLabel, pBuf);
BEGIN_REQUEST_HEADER (DeleteElementsToLabel, pBuf, req);
PEXStoreReqHead (DeleteElementsToLabel, req);
req->sid = structure;
req->position_whence = whence;
req->position_offset = offset;
req->label = label;
END_REQUEST_HEADER (DeleteElementsToLabel, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXDeleteBetweenLabels (display, structure, label1, label2)
INPUT Display *display;
INPUT PEXStructure structure;
INPUT long label1;
INPUT long label2;
{
register pexDeleteBetweenLabelsReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (DeleteBetweenLabels, pBuf);
BEGIN_REQUEST_HEADER (DeleteBetweenLabels, pBuf, req);
PEXStoreReqHead (DeleteBetweenLabels, req);
req->sid = structure;
req->label1 = label1;
req->label2 = label2;
END_REQUEST_HEADER (DeleteBetweenLabels, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXCopyElements (display, srcStructure, srcWhence1, srcOffset1, srcWhence2,
srcOffset2, destStructure, destWhence, destOffset)
INPUT Display *display;
INPUT PEXStructure srcStructure;
INPUT int srcWhence1;
INPUT long srcOffset1;
INPUT int srcWhence2;
INPUT long srcOffset2;
INPUT PEXStructure destStructure;
INPUT int destWhence;
INPUT long destOffset;
{
register pexCopyElementsReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (CopyElements, pBuf);
BEGIN_REQUEST_HEADER (CopyElements, pBuf, req);
PEXStoreReqHead (CopyElements, req);
req->src = srcStructure;
req->srcPosition1_whence = srcWhence1;
req->srcPosition1_offset = srcOffset1;
req->srcPosition2_whence = srcWhence2;
req->srcPosition2_offset = srcOffset2;
req->dst = destStructure;
req->dstPosition_whence = destWhence;
req->dstPosition_offset = destOffset;
END_REQUEST_HEADER (CopyElements, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}
void
PEXChangeStructureRefs (display, oldStructure, newStructure)
INPUT Display *display;
INPUT PEXStructure oldStructure;
INPUT PEXStructure newStructure;
{
register pexChangeStructureRefsReq *req;
char *pBuf;
LockDisplay (display);
PEXGetReq (ChangeStructureRefs, pBuf);
BEGIN_REQUEST_HEADER (ChangeStructureRefs, pBuf, req);
PEXStoreReqHead (ChangeStructureRefs, req);
req->old_id = oldStructure;
req->new_id = newStructure;
END_REQUEST_HEADER (ChangeStructureRefs, pBuf, req);
UnlockDisplay (display);
PEXSyncHandle (display);
}