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