xdr_array.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* xdr_array.c - XDR primatives for arrays */
  2. /* Copyright 1984-1992 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01g,26may92,rrr  the tree shuffle
  8. 01f,04oct91,rrr  passed through the ansification filter
  9.   -changed includes to have absolute path from h/
  10.   -changed copyright notice
  11. 01e,26jun90,hjb  removed sccsid[].
  12. 01d,11may90,yao  added include file memLib.h,
  13.  typecasted nodesize to int in routine xdr_array.
  14. 01c,11nov87,jlf  added wrs copyright, title, mod history, etc.
  15. 01b,06nov87,dnw  changed conditionals on KERNEL to DONT_PRINT_ERRORS.
  16. 01a,01nov87,rdc  first VxWorks version
  17. */
  18. #ifndef lint
  19. /* static char sccsid[] = "@(#)xdr_array.c 1.1 86/09/24 Copyr 1984 Sun Micro"; */
  20. #endif
  21. /*
  22.  * Copyright (c) 1987 Wind River Systems, Inc.
  23.  * Copyright (C) 1984, Sun Microsystems, Inc.
  24.  *
  25.  * These are the "non-trivial" xdr primitives used to serialize and de-serialize
  26.  * arrays.  See xdr.h for more info on the interface to xdr.
  27.  */
  28. #include "vxWorks.h"
  29. #include "memLib.h"
  30. #include "rpc/rpctypes.h"
  31. #include "rpc/xdr.h"
  32. #include "private/funcBindP.h"
  33. #include "stdlib.h"
  34. #include "string.h"
  35. #define PRINTERR if (_func_printErr != NULL) _func_printErr
  36. #define LASTUNSIGNED ((u_int)0-1)
  37. /*
  38.  * XDR an array of arbitrary elements
  39.  * *addrp is a pointer to the array, *sizep is the number of elements.
  40.  * If addrp is NULL (*sizep * elsize) bytes are allocated.
  41.  * elsize is the size (in bytes) of each element, and elproc is the
  42.  * xdr procedure to call to handle each element of the array.
  43.  */
  44. bool_t
  45. xdr_array(xdrs, addrp, sizep, maxsize, elsize, elproc)
  46. register XDR *xdrs;
  47. caddr_t *addrp; /* array pointer */
  48. u_int *sizep; /* number of elements */
  49. u_int maxsize; /* max numberof elements */
  50. u_int elsize; /* size in bytes of each element */
  51. xdrproc_t elproc; /* xdr routine to handle each element */
  52. {
  53. register u_int i;
  54. register caddr_t target = *addrp;
  55. register u_int c;  /* the actual element count */
  56. register bool_t stat = TRUE;
  57. register u_int nodesize;
  58. /* like strings, arrays are really counted arrays */
  59. if (! xdr_u_int(xdrs, sizep)) {
  60. #ifndef DONT_PRINT_ERRORS
  61. PRINTERR("xdr_array: size FAILEDn");
  62. #endif
  63. return (FALSE);
  64. }
  65. c = *sizep;
  66. if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) {
  67. #ifndef DONT_PRINT_ERRORS
  68. PRINTERR("xdr_array: bad size FAILEDn");
  69. #endif
  70. return (FALSE);
  71. }
  72. nodesize = c * elsize;
  73. /*
  74.  * if we are deserializing, we may need to allocate an array.
  75.  * We also save time by checking for a null array if we are freeing.
  76.  */
  77. if (target == NULL)
  78. switch (xdrs->x_op) {
  79. case XDR_DECODE:
  80. if (c == 0)
  81. return (TRUE);
  82. *addrp = target = (caddr_t) mem_alloc(nodesize);
  83. #ifndef DONT_PRINT_ERRORS
  84. if (target == NULL) {
  85. PRINTERR("xdr_array: out of memoryn");
  86. return (FALSE);
  87. }
  88. #endif
  89. bzero(target, (int)nodesize);
  90. break;
  91. case XDR_FREE:
  92. return (TRUE);
  93. case XDR_ENCODE:
  94. break;
  95. }
  96. /*
  97.  * now we xdr each element of array
  98.  */
  99. for (i = 0; (i < c) && stat; i++) {
  100. stat = (*elproc)(xdrs, target, LASTUNSIGNED);
  101. target += elsize;
  102. }
  103. /*
  104.  * the array may need freeing
  105.  */
  106. if (xdrs->x_op == XDR_FREE) {
  107. mem_free(*addrp, nodesize);
  108. *addrp = NULL;
  109. }
  110. return (stat);
  111. }
  112. /*
  113.  * xdr_vector():
  114.  *
  115.  * XDR a fixed length array. Unlike variable-length arrays,
  116.  * the storage of fixed length arrays is static and unfreeable.
  117.  * > basep: base of the array
  118.  * > size: size of the array
  119.  * > elemsize: size of each element
  120.  * > xdr_elem: routine to XDR each element
  121.  */
  122. bool_t
  123. xdr_vector(xdrs, basep, nelem, elemsize, xdr_elem)
  124. register XDR *xdrs;
  125. register char *basep;
  126. register u_int nelem;
  127. register u_int elemsize;
  128. register xdrproc_t xdr_elem;
  129. {
  130. register u_int i;
  131. register char *elptr;
  132. elptr = basep;
  133. for (i = 0; i < nelem; i++) {
  134. if (! (*xdr_elem)(xdrs, elptr, LASTUNSIGNED)) {
  135. return(FALSE);
  136. }
  137. elptr += elemsize;
  138. }
  139. return(TRUE);
  140. }