ncbi_std.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:7k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: ncbi_std.c,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:08:22  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* $Id: ncbi_std.c,v 1000.2 2004/06/01 18:08:22 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's offical duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  */
  35. /** @file ncbi_std.c
  36.  * Function definitions for toolkit independent utility functions?
  37.  */
  38. static char const rcsid[] = 
  39.     "$Id: ncbi_std.c,v 1000.2 2004/06/01 18:08:22 gouriano Exp $";
  40. #include <algo/blast/core/blast_def.h> /* for sfree() macro */
  41. #include <algo/blast/core/ncbi_std.h>
  42. void * BlastMemDup (const void *orig, size_t size)
  43. {
  44. void* copy;
  45. if (orig == NULL || size == 0)
  46. return NULL;
  47. if ((copy = malloc (size)) == NULL)
  48. return NULL;
  49. memcpy(copy, orig, size);
  50.     return copy;
  51. }
  52. /*****************************************************************************
  53. *
  54. *   ListNodeNew(vnp)
  55. *      adds after last node in list if vnp not NULL
  56. *
  57. *****************************************************************************/
  58. ListNode* ListNodeNew (ListNode* vnp)
  59. {
  60. ListNode* newnode;
  61. newnode = (ListNode*) calloc(1, sizeof(ListNode));
  62. if (vnp != NULL)
  63.     {
  64.         while (vnp->next != NULL)
  65.             vnp = vnp->next;
  66. vnp->next = newnode;
  67.     }
  68. return newnode;
  69. }
  70. /*****************************************************************************
  71. *
  72. *   ListNodeAdd(head)
  73. *      adds after last node in list if *head not NULL
  74. *      If *head is NULL, sets it to the new ListNode
  75. *      returns pointer to the NEW node added
  76. *
  77. *****************************************************************************/
  78. ListNode* ListNodeAdd (ListNode** head)
  79. {
  80. ListNode* newnode;
  81. if (head != NULL)
  82. {
  83. newnode = ListNodeNew(*head);
  84. if (*head == NULL)
  85. *head = newnode;
  86. }
  87. else
  88. newnode = ListNodeNew(NULL);
  89. return newnode;
  90. }
  91. /*   ListNodeAddPointer (head, choice, value)
  92. *      adds like ListNodeAdd()
  93. *      sets newnode->choice = choice (if choice does not matter, use 0)
  94. *      sets newnode->ptr = value
  95. *
  96. *****************************************************************************/
  97. ListNode* ListNodeAddPointer (ListNode** head, Uint1 choice, 
  98.                                 void *value)
  99. {
  100. ListNode* newnode;
  101. newnode = ListNodeAdd(head);
  102. if (newnode != NULL)
  103. {
  104. newnode->choice = choice;
  105. newnode->ptr = value;
  106. }
  107. return newnode;
  108. }
  109. /*****************************************************************************
  110. *
  111. *   ListNodeCopyStr (head, choice, str)
  112. *      adds like ListNodeAdd()
  113. *      sets newnode->choice = choice (if choice does not matter, use 0)
  114. *      sets newnode->ptr = str
  115. *         makes a COPY of str
  116. *      if str == NULL, does not add a ListNode
  117. *
  118. *****************************************************************************/
  119. ListNode* ListNodeCopyStr (ListNode** head, Uint1 choice, char* str)
  120. {
  121. ListNode* newnode;
  122. if (str == NULL) return NULL;
  123. newnode = ListNodeAdd(head);
  124. if (newnode != NULL)
  125. {
  126. newnode->choice = choice;
  127. newnode->ptr = strdup(str);
  128. }
  129. return newnode;
  130. }
  131. /*****************************************************************************
  132. *
  133. *   ListNodeFree(vnp)
  134. *    frees whole chain of ListNodes
  135. *       Does NOT free associated data pointers
  136. *           see ListNodeFreeData()
  137. *
  138. *****************************************************************************/
  139. ListNode* ListNodeFree (ListNode* vnp)
  140. {
  141. ListNode* next;
  142. while (vnp != NULL)
  143. {
  144. next = vnp->next;
  145. sfree(vnp);
  146. vnp = next;
  147. }
  148. return NULL;
  149. }
  150. /*****************************************************************************
  151. *
  152. *   ListNodeFreeData(vnp)
  153. *    frees whole chain of ListNodes
  154. *       frees associated data pointers - BEWARE of this if these are not
  155. *           allocated single memory block structures.
  156. *
  157. *****************************************************************************/
  158. ListNode* ListNodeFreeData (ListNode* vnp)
  159. {
  160. ListNode* next;
  161. while (vnp != NULL)
  162. {
  163. sfree(vnp->ptr);
  164. next = vnp->next;
  165. sfree(vnp);
  166. vnp = next;
  167. }
  168. return NULL;
  169. }
  170. /*****************************************************************************
  171. *
  172. *   ListNodeLen(vnp)
  173. *      returns the number of nodes in the linked list
  174. *
  175. *****************************************************************************/
  176. Int4 ListNodeLen (ListNode* vnp)
  177. {
  178. Int4 len;
  179. len = 0;
  180. while (vnp != NULL) {
  181. len++;
  182. vnp = vnp->next;
  183. }
  184. return len;
  185. }
  186. /*****************************************************************************
  187. *
  188. *   ListNodeSort(list, compar)
  189. *    Copied from SortListNode in jzcoll, renamed, for more general access
  190. *    Makes array from ListNode list, calls HeapSort, reconnects ListNode list
  191. *
  192. *****************************************************************************/
  193. ListNode* ListNodeSort (ListNode* list, 
  194.                int (*compar )(const void *, const void *))
  195. {
  196. ListNode* tmp,** head;
  197. Int4 count, i;
  198. if (list == NULL) return NULL;
  199. count = ListNodeLen (list);
  200. head = (ListNode* *) calloc (((size_t) count + 1), sizeof (ListNode*));
  201. for (tmp = list, i = 0; tmp != NULL && i < count; i++) {
  202. head [i] = tmp;
  203. tmp = tmp->next;
  204. }
  205. qsort (head, (size_t) count, sizeof (ListNode*), compar);
  206. for (i = 0; i < count; i++) {
  207. tmp = head [i];
  208. tmp->next = head [i + 1];
  209. }
  210. list = head [0];
  211. sfree (head);
  212. return list;
  213. }