home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume6 / rpc2 / part11 / rpc / rpcgen / xdr_update.c < prev   
Encoding:
C/C++ Source or Header  |  1986-11-30  |  1.9 KB  |  84 lines

  1. /*
  2.  * xdr_update.c: Additions to release 3.0 XDR routines required
  3.  *    for rpcgen.  These routines are from release 3.2BETA and
  4.  *    may be updated before final release.
  5.  *
  6.  * Copyright (C) 1986, Sun Microsystems, Inc.
  7.  *
  8.  */
  9.  
  10. #include <rpc/rpc.h>
  11. #define NULL 0
  12. #define LASTUNSIGNED    ((u_int)0-1)
  13.  
  14. /*
  15.  * xdr_pointer():
  16.  *
  17.  * XDR a pointer to a possibly recursive data structure. This
  18.  * differs with xdr_reference in that it can serialize/deserialiaze
  19.  * trees correctly.
  20.  *
  21.  *  What's sent is actually a union:
  22.  *
  23.  *  union object_pointer switch (boolean b) {
  24.  *  case TRUE: object_data data;
  25.  *  case FALSE: void nothing;
  26.  *  }
  27.  *
  28.  * > objpp: Pointer to the pointer to the object.
  29.  * > obj_size: size of the object.   
  30.  * > xdr_obj: routine to XDR an object.
  31.  *    
  32.  */
  33. bool_t                        
  34. xdr_pointer(xdrs,objpp,obj_size,xdr_obj)
  35.         register XDR *xdrs;
  36.         char **objpp;
  37.         u_int obj_size;
  38.         xdrproc_t xdr_obj;
  39. {                      
  40.                        
  41.         bool_t more_data;
  42.                 
  43.         more_data = (*objpp != NULL);
  44.         if (! xdr_bool(xdrs,&more_data)) {
  45.                 return(FALSE);
  46.         }
  47.         if (! more_data) {
  48.                 *objpp = NULL;
  49.                 return(TRUE);
  50.         }
  51.         return(xdr_reference(xdrs,objpp,obj_size,xdr_obj));
  52. }
  53.  
  54. /*
  55.  * xdr_vector():
  56.  *
  57.  * XDR a fixed length array. Unlike variable-length arrays,
  58.  * the storage of fixed length arrays is static and unfreeable.
  59.  * > basep: base of the array
  60.  * > size: size of the array
  61.  * > elemsize: size of each element
  62.  * > xdr_elem: routine to XDR each element
  63.  */
  64. bool_t
  65. xdr_vector(xdrs, basep, nelem, elemsize, xdr_elem)
  66.     register XDR *xdrs;
  67.     register char *basep;
  68.     register u_int nelem;
  69.     register u_int elemsize;
  70.     register xdrproc_t xdr_elem;    
  71. {
  72.     register u_int i;
  73.     register char *elptr;
  74.  
  75.     elptr = basep;
  76.     for (i = 0; i < nelem; i++) {
  77.         if (! (*xdr_elem)(xdrs, elptr, LASTUNSIGNED)) {
  78.             return(FALSE);
  79.         }
  80.         elptr += elemsize;
  81.     }
  82.     return(TRUE);    
  83. }
  84.