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

Windows编程

开发平台:

Visual C++

  1. /*************************************************************/
  2. /**                                                         **/
  3. /**                 Microsoft RPC Examples                  **/
  4. /**                 Dictionary Application                  **/
  5. /**          Copyright(c) Microsoft Corp. 1992-1996         **/
  6. /**                                                         **/
  7. /*************************************************************/
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <ctype.h>
  12. #ifndef _LOCAL
  13. #include "replay.h"
  14. #else
  15. #include "play.h"
  16. #endif // _LOCAL
  17. #include "dict0.h"
  18. #include "util0.h"
  19. /*************************************************************************/
  20. /***                RecordNode / RecordTree free routines              ***/
  21. /*************************************************************************/
  22. void
  23. RecordTreeNodeFree(
  24.     IN RecordTreeNode * node
  25.     )
  26. {
  27.     if (node == NULL)
  28.         return;
  29.     MIDL_user_free( node->item->name );
  30.     MIDL_user_free( node->item );
  31.     node->left = NULL;
  32.     node->right = NULL;
  33.     MIDL_user_free( node );
  34. }
  35. void
  36. RecordTreeFree(
  37.     IN RecordTreeNode * node
  38.     )
  39. {
  40.     if (node == NULL)
  41.         return;
  42.     if (node->left != NULL) {
  43.         RecordTreeFree(node->left);
  44.     }
  45.     if (node->right != NULL) {
  46.         RecordTreeFree(node->right);
  47.     }
  48.     RecordTreeNodeFree( node );
  49. }
  50. VDict_Status
  51. RDict_Free_Dict(
  52.     IN OUT RDict * r_dict
  53.     )
  54. {
  55.     RecordTreeFree( r_dict->root );
  56.     return(DICT_SUCCESS);
  57. }
  58. /*************************************************************************/
  59. /***                  State Allocate / Free routines                   ***/
  60. /*************************************************************************/
  61. DictState * allocate_state(void)
  62. {
  63.     DictState * pstate = (DictState*) MIDL_user_allocate(sizeof(DictState));
  64.     pstate->curr_record = (Record*) MIDL_user_allocate(sizeof(Record));
  65.     pstate->curr_record->name = (char*) MIDL_user_allocate(81 * sizeof(char));
  66.     // initialize curr_record to "minus infinity" in the order
  67.     pstate->curr_record->key = -1;
  68.     strcpy(pstate->curr_record->name, "");
  69.     pstate->ref_count = 0;
  70.     return(pstate);
  71. }
  72. void free_state(DictState * state)
  73. {
  74.     if (state != NULL) {
  75.         if (state->curr_record != NULL) {
  76.             if (state->curr_record->name != NULL)
  77.                 MIDL_user_free(state->curr_record->name);
  78.             MIDL_user_free(state->curr_record);
  79.         }
  80.         MIDL_user_free(state);
  81.     }
  82. }
  83. /*************************************************************************/
  84. /***                     Rdict Duplicate utilities                     ***/
  85. /*************************************************************************/
  86. RDict *
  87. RDict_Duplicate(
  88.     IN RDict * src
  89.     )
  90. {
  91.     RDict * dst = (RDict*) MIDL_user_allocate(sizeof(RDict));
  92.     dst->root = (RecordTreeNode*) Tree_Duplicate((TreeNode*)src->root);
  93.     dst->size = src->size;
  94.     dst->state = DictState_Duplicate(src->state);
  95.     return(dst);
  96. }
  97. DictState *
  98. DictState_Duplicate(
  99.     IN DictState * src
  100.     )
  101. {
  102.     DictState * dst = (DictState*) MIDL_user_allocate(sizeof(DictState));
  103.     dst->curr_record = ItemDuplicate(src->curr_record);
  104.     dst->ref_count = src->ref_count;
  105.     return(dst);
  106. }
  107. TreeNode *
  108. TreeNode_Duplicate(
  109.     IN TreeNode * src
  110.     )
  111. {
  112.     TreeNode * pnode = (TreeNode*) MIDL_user_allocate(sizeof(TreeNode));
  113.     pnode->left = pnode->right = NULL;
  114.     pnode->item = ItemDuplicate(src->item);
  115.     return(pnode);
  116. }
  117. TreeNode *
  118. Tree_Duplicate(
  119.     IN TreeNode * src
  120.     )
  121. {
  122.     TreeNode * dst;
  123.     if (src == NULL)
  124.         return((TreeNode*)NULL);
  125.     dst = TreeNode_Duplicate(src);
  126.     dst->left = Tree_Duplicate(src->left);
  127.     dst->right = Tree_Duplicate(src->right);
  128.     return(dst);
  129. }
  130. /*************************************************************************/
  131. /***                MIDL_user_allocate / MIDL_user_free                ***/
  132. /*************************************************************************/
  133. void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t count)
  134. {
  135.     return(malloc(count));
  136. }
  137. void __RPC_USER MIDL_user_free(void __RPC_FAR * p)
  138. {
  139.     free(p);
  140. }
  141. /*************************************************************************/
  142. /***                          Utility functions                        ***/
  143. /*************************************************************************/
  144. /*  In the most general case *cmp is a two argument function:
  145.     (*cmp)(void *item0, void *item1) which compares two items,
  146.     and returns:    -1 if item0 < item1;
  147.                      0 if item0 == item1;
  148.                     +1 if item0 > item1.
  149.     The common case is: each item has a field named "key";
  150.     item.key is of type long, or string.
  151. */
  152. int
  153. comp(void* x, void* y)
  154. {
  155.     int res = ((Record*)x)->key - ((Record*)y)->key;
  156.     if (res == 0)
  157.         return( strcmp( ((Record*)x)->name, ((Record*)y)->name ) );
  158.     else
  159.         return( res ) ;
  160. }
  161. Record *
  162. ItemDuplicate(
  163.     Record * item
  164.     )
  165. {
  166.     if (item == NULL)
  167.         return(NULL);
  168.     return( makeRecord( item->key, item->name ) );
  169. }
  170. Record *
  171. makeRecord(
  172.     short key,
  173.     char * name
  174.     )
  175. {
  176.     Record * pr = (Record*) MIDL_user_allocate(sizeof(Record));
  177.     if (!name)
  178.         printf("makeRecord: NULL namen");
  179.     pr->name = (char*) MIDL_user_allocate(strlen(name)+1);
  180.     strcpy(pr->name, name);
  181.     pr->key = key;
  182.     return(pr);
  183. }
  184. void
  185. freeRecord(
  186.     Record * pr
  187.     )
  188. {
  189.     if (pr != NULL) {
  190.         if (pr->name != NULL)
  191.             MIDL_user_free(pr->name);
  192.         MIDL_user_free(pr);
  193.     }
  194. }
  195. void
  196. ItemCopy(
  197.     IN Record * src,
  198.     OUT Record * dest
  199.     )
  200. {
  201.     int i;
  202.     dest->key = src->key;
  203.     // copy name, trubcated to 80 characters
  204.     for(i=0 ; (src->name[i] != '') && (i<80) ; i++)
  205.         dest->name[i]=src->name[i];
  206.     dest->name[i]='';
  207. }
  208. void
  209. printRecord(void* rp)
  210. {
  211.     printf("%d : %sn", ((Record*)rp)->key, ((Record*)rp)->name);
  212. }
  213. void
  214. Dict_Print(             /* prints the binary tree (indented right subtree,
  215.                            followed by the root, followed by the indented
  216.                            right dubtree) */
  217.     Dictionary * dp,
  218.     int indent)         /* number of spaces to indent subsequent levels */
  219. {
  220.     prinTree(0, indent, dp->root, dp->print_rec);
  221. }
  222. char spaces[] =
  223. "                                                                                                                                                                                                                                                       ";
  224. void
  225. prinTree(
  226.     int lmargin,             /* indentation of the root of the tree     */
  227.     int indent,              /* indentation of subsequent levels        */
  228.     TreeNode *np,            /* pointer to the root node                */
  229.     PrintFun print)          /* short, one line, record print routine   */
  230. {
  231.     if (np == NULL)
  232.         return;
  233.     prinTree(lmargin+indent, indent, np->right, print);
  234.     if (lmargin > sizeof(spaces))
  235.         lmargin = sizeof(spaces);;
  236.     spaces[lmargin] = 0;
  237.     printf(spaces);
  238.     spaces[lmargin] = ' ';
  239.     (*print)(np->item);
  240.     prinTree(lmargin+indent, indent, np->left, print);
  241. }
  242. TreeNode*
  243. makeNode(void * item)
  244. {
  245.     TreeNode* tp;
  246.     tp = (TreeNode*)MIDL_user_allocate(sizeof(TreeNode));
  247.     tp->item = item;
  248.     tp->left = tp->right = NULL;
  249.     return(tp);
  250. }