|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 21594 (0x545a) Types: TextFile Names: »resource.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/Toolkit/Xr/src/Xrlib/Intrinsic/resource.c«
/* * $Source: /u1/Xr/src/Xrlib/Intrinsic/RCS/resource.c,v $ * $Header: resource.c,v 1.1 86/12/17 09:09:19 swick Exp $ */ #ifndef lint static char *rcsid_resource_c = "$Header: resource.c,v 1.1 86/12/17 09:09:19 swick Exp $"; #endif lint #include <Xr/xr-copyright.h> /* $Header: resource.c,v 1.1 86/12/17 09:09:19 swick Exp $ */ /* Copyright 1986, Hewlett-Packard Company */ /* Copyright 1986, Massachussetts Institute of Technology */ static char rcsid[] = "$Header: resource.c,v 1.1 86/12/17 09:09:19 swick Exp $"; /*************************************<+>************************************* ***************************************************************************** ** ** File: resource.c ** ** Project: X-ray Toolbox ** ** Description: This file contains the source for the X-ray resource ** manager. ** ** ** ------------------------ MODIFICATION RECORD ------------------------ * * $Log: resource.c,v $ * Revision 1.1 86/12/17 09:09:19 swick * Initial revision * * Revision 7.0 86/11/13 08:21:40 08:21:40 rick () * Final QA release * * Revision 6.0 86/11/10 15:22:49 15:22:49 rick () * QA #2 release * * Revision 5.2 86/11/07 14:02:35 14:02:35 rick () * Added the copyright message. * * Revision 5.1 86/11/03 15:10:10 15:10:10 rick () * Remove the MSG_UPDATE message. Made the error number return conditions * more explicit. Put in additional error checking. * * Revision 5.0 86/10/28 08:23:31 08:23:31 rick () * QA #1.1 release * * Revision 4.0 86/10/20 12:09:30 12:09:30 rick () * QA 1 release * * Revision 3.3 86/10/17 12:23:56 12:23:56 rick () * Linted * * Revision 3.2 86/10/16 11:21:08 11:21:08 rick () * Added register variables. * * Revision 3.1 86/10/15 13:57:44 13:57:44 rick () * Added the code for the NEWTYPE and FREETYPE messages. * * Revision 3.0 86/10/02 15:59:19 15:59:19 rick () * Alpha release set to 3.0 * * Revision 2.0 86/09/16 08:03:39 08:03:39 rick () * *** empty log message *** * * Revision 1.1 86/09/03 13:35:18 13:35:18 rick () * Initial revision * * ***************************************************************************** *************************************<+>*************************************/ #include <X/Xlib.h> #include <Xr/defs.h> #include <Xr/types.h> extern xrResource * _XrTreeSearch(); /* * Defines used internally by the resource manager. */ #define _XrINTERNSET 64000 /* reserved resource types and ids */ #define _XrINTERNCOUNT 11 /* number of internal resource types */ /* * Definition and initialization of X-ray's internal resource types */ static xrResourceType internTypeSet[] = { { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL }, { NULL, NULL } }; static xrResourceType * internType = internTypeSet; /* * Definition and initialization of the variable to hold the * application defined resource types. */ static xrResourceType * externType = NULL; static INT32 externTypeCount = 0; \f /*************************************<->************************************* * * XrResource (message, data) * INT32 message; * INT8 * data; * * * Description: * ----------- * XrResource() is the main resource manager routine. The resource * manager is used to make the control and acess of resource objects * easy by allowing resources to be added, retrieved, and reoved from * an internally managed list. The resource manager allow resources * to reside explicitly in memory or within a resource disc file. * XrResource() provides the message handling code segments for each * of the resource managers capabilities. For a complete description * of the resource manager, refer to XrResource(3XR) and the X-ray * toolbox manual. * * * Inputs: * ------ * message = Contains the message which describes the capability * to be executed. * * data = Contains a pointer to a structure necessary for the * completion of the message. * * For a complete description of the resource managers messages and * data parameters, refer to XrResource(3XR) and the X-ray toolbox manual. * * Outputs: * ------- * TRUE = Returned as the value of the function if the message succeeds. * * FALSE = Returned as the value of the function if the message fails. * * data = Several of the messages return information in the structure * pointed at by data. * * xrError = The error variable is set to one several values upon * failure of this routine. * * For a complete description of the values returned in data, * refer to XrResource(3XR) and the X-ray toolbox manual. * * * Procedures Called * ----------------- * _XrVerifyType * _XrResourceGet * _XrResourcePut * _XrTreeSearch - tree.c * _XrTreeInsert - tree.c * _XrTreeDelete - tree.c * *************************************<->***********************************/ XrResource (message, data) UINT32 message; INT8 * data; { xrResource ** _XrVerifyType(); /* * Set up a switch statement to handle each of the possible * messages as an independent case. */ switch (message) { /* * The following set of messages handle the file accessing * for the resource manager. */ case MSG_OPEN: /* Open a resource file */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_CLOSE: /* Close a resource file */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_NEW: /* Create a new disc based resource */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_FREE: /* Destroy a disc based resource */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_UPDATEFILE: /* Update an entire resource file */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_UPDATEALLFILES: /* Update all of the resource files */ xrErrno = XrINVALIDMSG; return (FALSE); break; /* * The following set of messages provide for the main-line * accessing of the resources contained in the resource lists. */ case MSG_ADD: /* Add a resource to the tree */ { xrResourceInfo * resourceInfo; xrResource resource; xrResource * node; xrResource ** parent; if ((resourceInfo = (xrResourceInfo *) data) == NULL) { xrErrno = XrINVALIDPARM; return (FALSE); } /* * Verify that the id is valid. */ if (resourceInfo -> resourceId == 0) { xrErrno = XrINVALIDID; return (FALSE); } /* * Verify that the resource type specified is ok. */ if ((parent = _XrVerifyType (resourceInfo -> resourceType)) == (xrResource **) NULL) return (FALSE); /* * Check to see if the node is in the tree. If it is and * it is locked, fail. */ if ((node = _XrTreeSearch(resourceInfo->resourceId, &parent)) != (xrResource *) NULL) if (node -> resourceState & XrLOCK) { xrErrno = XrINVALIDSTATE; return (FALSE); } /* * See if the new resource is from disc or memory. * If from disc, go and read it. */ if (resourceInfo -> resourceObject == NULL) { if (_XrResourceGet (resourceInfo, &resource) == FALSE) return (FALSE); } else { resource.resourceId = resourceInfo -> resourceId; resource.resourceState = resourceInfo -> resourceState; resource.resourceObject = resourceInfo -> resourceObject; resource.resourceFile = XrMEMORY; } /* * If the node is already in the tree, save the old * resource object into the application info structure * so that it has access to it. If the node is not * in the tree, allocate a node, set the neccessay * node values and add the node into the tree. */ if (node != NULL) { if (node -> resourceFile == XrMEMORY) resourceInfo -> resourceObject = node -> resourceObject; } else { if ((node = (xrResource *) (*xrMalloc)(sizeof(xrResource))) == NULL) { xrErrno = XrOUTOFMEM; return (FALSE); } node -> resourceId = resource.resourceId; node -> left = node -> right = NULL; _XrTreeInsert (parent, node); } /* * Set the remaining node values and return success. */ node -> resourceState = resource.resourceState; node -> resourceObject = resource.resourceObject; node -> resourceFile = resource.resourceFile; return (TRUE); } break; case MSG_REMOVE: /* Remove a resource from the tree */ { xrResourceInfo * resourceInfo; xrResource * node; xrResource ** parent; if ((resourceInfo = (xrResourceInfo *) data) == NULL) { xrErrno = XrINVALIDPARM; return (FALSE); } /* * Verify that the resource type specified is ok. */ if ((parent = _XrVerifyType (resourceInfo -> resourceType)) == (xrResource **) NULL) return (FALSE); /* * Check to see if the node is in the tree. If not, fail. */ if ((node = _XrTreeSearch (resourceInfo -> resourceId, &parent)) == (xrResource *) NULL) { xrErrno = XrINVALIDID; return (FALSE); } /* * See if the resource is locked. If so, fail. */ if (node -> resourceState & XrLOCK) { xrErrno = XrINVALIDSTATE; return (FALSE); } /* * See if the resource is from disc or memory. If from * disc, and its update flag is set, and its protect flag * is not set, write the resource. */ if (node -> resourceFile != XrMEMORY) { if (node -> resourceState & XrUPDATE && !(node -> resourceState & XrPROTECT)) { if (_XrResourcePut (node) == FALSE) return (FALSE); } } else { resourceInfo -> resourceState = node -> resourceState; resourceInfo -> resourceObject = node -> resourceObject; } /* * Delete the node from the tree and free the node. */ _XrTreeDelete (parent, node); (*xrFree) (node); return (TRUE); } break; case MSG_FIND: /* Search for a resource in the tree */ { xrResourceInfo * resourceInfo; xrResource * node; xrResource ** parent; if ((resourceInfo = (xrResourceInfo *) data) == NULL) { xrErrno = XrINVALIDPARM; return (FALSE); } /* * Verify that the resource type specified is ok. */ if ((parent = _XrVerifyType (resourceInfo -> resourceType)) == (xrResource **) NULL) return (FALSE); /* * Check to see if the node is in the tree. If not, fail. */ if ((node = _XrTreeSearch(resourceInfo->resourceId, &parent)) == (xrResource *) NULL) { xrErrno = XrINVALIDID; return (FALSE); } /* * Copy the members of the resource node that has been found * into the resourceInfo structure provided by the application. */ resourceInfo -> resourceState = node -> resourceState; resourceInfo -> resourceObject = node -> resourceObject; resourceInfo -> resourceFile = node -> resourceFile; return (TRUE); } break; case MSG_UPDATE: /* Update a resource to disc */ xrErrno = XrINVALIDMSG; return (FALSE); break; case MSG_SETSTATE: /* Set the state of a resource */ { xrResourceInfo * resourceInfo; xrResource * node; xrResource ** parent; if ((resourceInfo = (xrResourceInfo *) data) == NULL) { xrErrno = XrINVALIDPARM; return (FALSE); } /* * Verify that the resource type specified is ok. */ if ((parent = _XrVerifyType (resourceInfo -> resourceType)) == (xrResource **) NULL) return (FALSE); /* * Check to see if the node is in the tree. If not, fail. */ if ((node = _XrTreeSearch(resourceInfo->resourceId, &parent)) == (xrResource *) NULL) { xrErrno = XrINVALIDID; return (FALSE); } /* * Set the state and return success. */ node -> resourceState = resourceInfo -> resourceState; return (TRUE); } break; /* * The following two messages handle the addition and deletion * of application defined resoruce types. */ case MSG_NEWTYPE: /* Create a new resource type */ { xrResourceTypeInfo * newType; INT32 i; if ((newType = (xrResourceTypeInfo *) data) == NULL) { xrErrno = XrINVALIDPARM; return (FALSE); } if (newType -> resourceType < 1 || newType -> resourceType > 63999) { xrErrno = XrINVALIDTYPE; return (FALSE); } if (externTypeCount == 0) { if ((externType = (xrResourceType *) (*xrMalloc) ((newType -> resourceType + 1) * sizeof (xrResourceType))) == NULL) { xrErrno = XrOUTOFMEM; return (FALSE); } } else if (externTypeCount - 1 < newType -> resourceType) { if ((externType = (xrResourceType *) (*xrRealloc) (externType, (newType -> resourceType + 1) * sizeof (xrResourceType))) == NULL) { xrErrno = XrOUTOFMEM; return (FALSE); } } else if (externType[newType -> resourceType].resourceHandler != (xrPFI) -1) { xrErrno = XrINVALIDTYPE; return (FALSE); } for (i = externTypeCount; i < newType -> resourceType + 1; i++) { externType[i].resourcePtr = NULL; externType[i].resourceHandler = (xrPFI) - 1; } if (externTypeCount < newType -> resourceType + 1) externTypeCount = newType -> resourceType + 1; externType[newType -> resourceType].resourceHandler = 0; return (TRUE); } break; case MSG_FREETYPE: /* Destroy a resource type */ { UINT16 freeType; INT32 i; freeType = (UINT16) data; if (freeType == 0 || freeType >= externTypeCount) { xrErrno = XrINVALIDTYPE; return (FALSE); } if (externType[freeType].resourcePtr != NULL || externType[freeType].resourceHandler != NULL) { xrErrno = XrINVALIDTYPE; return (FALSE); } if (freeType == externTypeCount - 1) { for (i = externTypeCount - 2; i > 0; i--) if ((externType[i].resourceHandler) != (xrPFI) -1) break; if (i == 0) { free (externType); externType = NULL; externTypeCount = 0; } else { if ((externType = (xrResourceType *) (*xrRealloc) (externType, (i + 1) * sizeof (xrResourceType))) == NULL) { xrErrno = XrOUTOFMEM; return (FALSE); } externTypeCount = i + 1; } } else externType[freeType].resourceHandler = (xrPFI) -1; return (TRUE); } break; default: xrErrno = XrINVALIDMSG; return (FALSE); break; } } \f /*************************************<->************************************* * * _XrVerifyType (resourceType) * UINT16 resourceType; * * * Description: * ----------- * _XrVerifyType is a static internal routine which verifys that * the resource type specified is valid whether being an internal * or external type. When the type is verified, the pointer to * the head of the tree which contains the resources for the type * is extracted and returned. * * * Inputs: * ------ * resourceType = The 16 bit unsigned integer resource * type to be verified. * * Outputs: * ------- * treeHead = Returned as the value of the function when it succeeds. * * NULL = Returned as the value of the function when it fails. * * xrErrno = When this routine fails, xrErrno is set to XrINVALIDID. * * * Procedures Called * ----------------- * None * *************************************<->***********************************/ static xrResource ** _XrVerifyType (resourceType) UINT16 resourceType; { if (resourceType >= _XrINTERNSET && resourceType <= _XrINTERNSET + _XrINTERNCOUNT - 1) return (&((internType + resourceType - _XrINTERNSET) -> resourcePtr)); else if (resourceType < externTypeCount && resourceType != 0 && &(externType + resourceType) -> resourcePtr != NULL) return (&((externType + resourceType) -> resourcePtr)); else { xrErrno = XrINVALIDTYPE; return (NULL); } } \f /*************************************<->************************************* * * _XrResourceGet (resourceInfo, resource) * xrResourceInfo * resourceInfo; * xrResource * resource; * * * Description: * ----------- * _XrResourceGet() finds and reads a disc based resource described * by resourceInfo. The resource is information read is placed * into the resource structure pointed at by resource. * * * Inputs: * ------ * resourceInfo = This is a pointer to an xrResourceInfo structure * which contains the type, id, state, and file of * the resource to be read. * * resource = This is a pointer to an xrResource structure. * It is only used to return values. * * * Outputs: * ------- * TRUE = Returned as the value of the function if the resource * is successfully read. * * FALSE = Returned as the value of the function if the resource * cannot be found or the file identifier in resourceInfo * is invalid. * * resource = All of the fields of this structure will be set to * the appropriate resource information when the routine * succeeds. * * xrErrno = When this routine fails, xrErrno is set to XrFILEERROR. * * * Procedures Called * ----------------- * ??? * ??? * *************************************<->***********************************/ static _XrResourceGet (resourceInfo, resource) xrResourceInfo * resourceInfo; xrResource * resource; { xrErrno = XrINVALIDPARM; return (FALSE); } \f /*************************************<->************************************* * * _XrResourcePut (resource) * xrResource * resource; * * * Description: * ----------- * _XrResourceGet() finds and writes a disc based resource contained * in resource. * * * Inputs: * ------ * resource = This is a pointer to an xrResource structure which * contains the resource information to be written. * * * Outputs: * ------- * TRUE = Returned as the value of the function if the resource * is successfully written. * * FALSE = Returned as the value of the function if the file * file identifier is invalid. * * xrErrno = When this routine fails, xrErrno is set to XrFILEERROR. * * * Procedures Called * ----------------- * ??? * ??? * *************************************<->***********************************/ static _XrResourcePut (resource) xrResource * resource; { xrErrno = XrINVALIDPARM; return (FALSE); }