XMITU.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /****************************************************************************
  2.                    Microsoft RPC Version 2.0
  3.            Copyright Microsoft Corp. 1992, 1993, 1994- 1996
  4.                         xmit Example
  5.     FILE:       xmitu.c
  6.     PURPOSE:    Utility functions used by both client and server
  7.                 sides of the RPC distributed application.
  8.                 This sample demonstrates the transmit_as example.
  9.                 A doubly-linked list is transmitted over the network
  10.                 as a sized array.
  11.     RELATED:    xmits.c - server main
  12.                 xmitp.c - remote procedures
  13.                 xmitc.c - client main
  14.     FUNCTIONS:  DOUBLE_LINK_TYPE_to_xmit - convert list to array
  15.                 DOUBLE_LINK_TYPE_from_xmit - convert array to list
  16.                 DOUBLE_LINK_TYPE_free_inst - free linked list memory
  17.                 DOUBLE_LINK_TYPE_free_xmit - free array memory
  18.                 midl_user_allocate - user-supplied memory allocator
  19.                 midl_user_free - user-supplied routine to free memory
  20.                 ArrayWalkProc - utility to display the array
  21.                 ListWalkProc - utility to display the linked list
  22.                 InsertNewNode - utility to add a node to the list
  23.     COMMENTS:   This sample program generates a linked list to
  24.                 demonstrate how a list with aliasing can be transmitted
  25.                 using the transmit_as attribute as a sized array.
  26.                 The pointers are rebuilt on the server side.
  27. ****************************************************************************/
  28. #include <stdlib.h>
  29. #include <stdio.h>
  30. #include "xmit.h"    // header file generated by MIDL compiler
  31. #include "xmitu.h"
  32. /***************************************************************************/
  33. void ArrayWalkProc(DOUBLE_XMIT_TYPE * pArray)
  34. {
  35.     int i;
  36.     printf("Display contents of transmitted array:n");
  37.     for (i = 0; i < pArray->sSize; i++)
  38.         printf("pArray->asNumber[%d] = %dn", i, pArray->asNumber[i]);
  39. }
  40. void ListWalkProc(DOUBLE_LINK_TYPE * pList)
  41. {
  42.     printf("Display contents of doubly linked list:n");
  43.     while (pList != NULL) {
  44.         printf("pList @0x%lx = %d, Next = 0x%lxn",
  45.                pList, pList->sNumber, pList->pNext);
  46.         pList = pList->pNext;
  47.     }
  48. }
  49. DOUBLE_LINK_TYPE * InsertNewNode(short sValue, DOUBLE_LINK_TYPE * pPrevious)
  50. {
  51.     DOUBLE_LINK_TYPE * pNew;
  52.     do {
  53.         pNew = (DOUBLE_LINK_TYPE *)midl_user_allocate(sizeof(DOUBLE_LINK_TYPE));
  54.     } while (pNew == pPrevious);
  55.     pNew->pNext = NULL;      // initialize
  56.     pNew->pPrevious = NULL;  // initialize
  57.     pNew->sNumber = sValue;  // insert b between a and c
  58.     pNew->pPrevious = pPrevious;             // prev(b) = a
  59.     if (pPrevious == NULL)
  60.         pNew->pNext = NULL;
  61.     else {
  62.         pNew->pNext = pPrevious->pNext;      // next(b) = c
  63.         pPrevious->pNext = pNew;             // next(a) = b
  64.         if (pNew->pNext != NULL)
  65.             (pNew->pNext)->pPrevious = pNew; // prev(c) = b
  66.     }
  67.     return(pNew);
  68. }
  69. /***************************************************************************/
  70. void __RPC_FAR * __RPC_USER midl_user_allocate(size_t len)
  71. {
  72.     return(malloc(len));
  73. }
  74. void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
  75. {
  76.     free(ptr);
  77. }
  78. /***************************************************************************/
  79. /* convert from linked list to array */
  80. void __RPC_USER
  81. DOUBLE_LINK_TYPE_to_xmit(
  82.     DOUBLE_LINK_TYPE __RPC_FAR * pList,
  83.     DOUBLE_XMIT_TYPE __RPC_FAR * __RPC_FAR * ppArray)
  84. {
  85.     short cCount = 0;
  86.     DOUBLE_LINK_TYPE * pHead = pList;  // save pointer to start
  87.     DOUBLE_XMIT_TYPE * pArray;
  88.     /* count the number of elements to allocate memory */
  89.     for (; pList != NULL; pList = pList->pNext)
  90.         cCount++;
  91.     /* allocate the memory for the array */
  92.     pArray = (DOUBLE_XMIT_TYPE *) midl_user_allocate
  93.              (sizeof(DOUBLE_XMIT_TYPE) + (cCount * sizeof(short)));
  94.     pArray->sSize = cCount;
  95.     /* copy the linked list contents into the array */
  96.     for (cCount = 0, pList = pHead; pList != NULL; pList = pList->pNext)
  97.         pArray->asNumber[cCount++] = pList->sNumber;
  98.     /* return the address of the pointer to the array */
  99.     *ppArray = pArray;
  100. }
  101. /* convert from array to linked list */
  102. void __RPC_USER
  103. DOUBLE_LINK_TYPE_from_xmit(
  104.     DOUBLE_XMIT_TYPE __RPC_FAR * pArray,
  105.     DOUBLE_LINK_TYPE __RPC_FAR * pList)
  106. {
  107.     DOUBLE_LINK_TYPE *pCurrent;
  108.     int i;
  109.     if (pArray->sSize <= 0) {  // error checking
  110.         pList = NULL;
  111.         return;
  112.     }
  113.     if (pList == NULL)
  114.         pList = InsertNewNode(pArray->asNumber[0], NULL);
  115.     else {
  116.         DOUBLE_LINK_TYPE_free_inst(pList);  // free all other nodes
  117.         pList->sNumber = pArray->asNumber[0];
  118.         pList->pNext = NULL;
  119.     }
  120.     pCurrent = pList;
  121.     for (i = 1; i < pArray->sSize; i++)  // write new values
  122.         pCurrent = InsertNewNode(pArray->asNumber[i], pCurrent);
  123. }
  124. /* free the doubly linked list */
  125. /* move forward through list, freeing the previous entry */
  126. void __RPC_USER
  127. DOUBLE_LINK_TYPE_free_inst(
  128.     DOUBLE_LINK_TYPE __RPC_FAR * pList)
  129. {
  130.     while (pList->pNext != NULL)  // go to end of list
  131.         pList = pList->pNext;
  132.     pList = pList->pPrevious;
  133.     while (pList != NULL) {  // back through list
  134.         midl_user_free(pList->pNext);
  135.         pList = pList->pPrevious;
  136.     }
  137. }
  138. /* free the array structure */
  139. void __RPC_USER
  140. DOUBLE_LINK_TYPE_free_xmit(
  141.     DOUBLE_XMIT_TYPE __RPC_FAR * pArray)
  142. {
  143.     midl_user_free(pArray);
  144. }
  145. /* end file xmitu.c */