/eucalyptus-c/src/addressbook_match.c

# · C · 252 lines · 199 code · 38 blank · 15 comment · 38 complexity · d60e585e0522465d498c50f1d14b6719 MD5 · raw file

  1. /*
  2. * Eucalyptus
  3. * by Paul A. Schifferer
  4. *
  5. * $Id: addressbook_match.c,v 1.2 2000/02/06 17:03:39 cipher Exp $
  6. * Module: addressbook_match.c
  7. * Matching functions for the address book
  8. *
  9. * Copyright Š 1997-2000 Isengard Developments
  10. * All rights reserved.
  11. */
  12. #include <stdio.h>
  13. #include <string.h>
  14. #include "eucalyptus.h"
  15. #if 0
  16. AddressEntry *MatchAddress(LONG num)
  17. {
  18. AddressEntry *ae, *aematch = NULL;
  19. LONG i;
  20. if(num == ~0)
  21. return(NULL);
  22. ObtainSemaphore(&euc.Locks.Addresses);
  23. for(ae = (AddressEntry *)euc.Addresses.lh_Head, i = -1;
  24. ae->Node.ln_Succ;
  25. ae = (AddressEntry *)ae->Node.ln_Succ)
  26. {
  27. i++;
  28. if(num == i)
  29. {
  30. aematch = ae;
  31. break;
  32. }
  33. if(ae->Members)
  34. {
  35. AddressEntry *aem;
  36. for(aem = (AddressEntry *)ae->Members->lh_Head;
  37. aem->Node.ln_Succ;
  38. aem = (AddressEntry *)aem->Node.ln_Succ)
  39. {
  40. i++;
  41. if(num == i)
  42. {
  43. aematch = aem;
  44. break;
  45. }
  46. }
  47. }
  48. }
  49. ReleaseSemaphore(&euc.Locks.Addresses);
  50. return(aematch);
  51. }
  52. LONG MatchAddressNum(AddressEntry *aematch)
  53. {
  54. AddressEntry *ae;
  55. LONG i, m = ~0;
  56. if(!aematch)
  57. return(~0);
  58. ObtainSemaphore(&euc.Locks.Addresses);
  59. for(ae = (AddressEntry *)euc.Addresses.lh_Head, i = -1;
  60. ae->Node.ln_Succ;
  61. ae = (AddressEntry *)ae->Node.ln_Succ)
  62. {
  63. i++;
  64. if(ae == aematch)
  65. {
  66. m = i;
  67. break;
  68. }
  69. if(ae->Members &&
  70. !IsListEmpty(ae->Members))
  71. {
  72. AddressEntry *aem;
  73. for(aem = (AddressEntry *)ae->Members->lh_Head;
  74. aem->Node.ln_Succ;
  75. aem = (AddressEntry *)aem->Node.ln_Succ)
  76. {
  77. i++;
  78. if(aem == aematch)
  79. {
  80. m = i;
  81. break;
  82. }
  83. }
  84. }
  85. }
  86. ReleaseSemaphore(&euc.Locks.Addresses);
  87. return(m);
  88. }
  89. AddressEntry *MatchAddressName(UBYTE *name, BOOL partial)
  90. {
  91. AddressEntry *ae, *aematch = NULL;
  92. LONG count = 0, l;
  93. UBYTE cname[101];
  94. if(!name)
  95. return(NULL);
  96. ObtainSemaphore(&euc.Locks.Addresses);
  97. for(ae = (AddressEntry *)euc.Addresses.lh_Head;
  98. ae->Node.ln_Succ;
  99. ae = (AddressEntry *)ae->Node.ln_Succ)
  100. {
  101. strncpy(cname, ae->FirstName, sizeof(cname) - 1);
  102. strncat(cname, " ", sizeof(cname) - 1);
  103. strncat(cname, ae->LastName, sizeof(cname) - 1);
  104. if(partial)
  105. {
  106. l = strlen(name);
  107. if(!strnicmp(cname, name, l) ||
  108. !strnicmp(ae->Nickname, name, l))
  109. {
  110. count++;
  111. aematch = ae;
  112. break;
  113. // continue;
  114. }
  115. }
  116. else
  117. {
  118. if(!stricmp(cname, name) ||
  119. !stricmp(ae->Nickname, name))
  120. {
  121. count++;
  122. aematch = ae;
  123. break;
  124. // continue;
  125. }
  126. }
  127. if(ae->Members)
  128. {
  129. AddressEntry *aem;
  130. for(aem = (AddressEntry *)ae->Members->lh_Head;
  131. aem->Node.ln_Succ;
  132. aem = (AddressEntry *)aem->Node.ln_Succ)
  133. {
  134. strncpy(cname, aem->FirstName, sizeof(cname) - 1);
  135. strncat(cname, " ", sizeof(cname) - 1);
  136. strncat(cname, aem->LastName, sizeof(cname) - 1);
  137. if(partial)
  138. {
  139. l = strlen(name);
  140. if(!strnicmp(cname, name, l) ||
  141. !strnicmp(ae->Nickname, name, l))
  142. {
  143. count++;
  144. aematch = aem;
  145. break;
  146. // continue;
  147. }
  148. }
  149. else
  150. {
  151. if(!stricmp(cname, name) ||
  152. !stricmp(ae->Nickname, name))
  153. {
  154. count++;
  155. aematch = aem;
  156. break;
  157. // continue;
  158. }
  159. }
  160. }
  161. }
  162. }
  163. ReleaseSemaphore(&euc.Locks.Addresses);
  164. if(count > 1)
  165. { // ambiguous match
  166. }
  167. return(aematch);
  168. }
  169. AddressEntry *MatchAddressGroup(UBYTE *name)
  170. {
  171. AddressEntry *ae, *aem = NULL;
  172. ObtainSemaphore(&euc.Locks.Addresses);
  173. for(ae = (AddressEntry *)euc.Addresses.lh_Head;
  174. ae->Node.ln_Succ;
  175. ae = (AddressEntry *)ae->Node.ln_Succ)
  176. {
  177. if(!ae->Members)
  178. continue;
  179. if(!stricmp(name, ae->FirstName))
  180. {
  181. aem = ae;
  182. break;
  183. }
  184. }
  185. ReleaseSemaphore(&euc.Locks.Addresses);
  186. return(aem);
  187. }
  188. AddressEntry *GetGroupHeader(AddressEntry *aematch)
  189. {
  190. AddressEntry *ae;
  191. if(!aematch)
  192. return(NULL);
  193. if(aematch->Members)
  194. return(aematch);
  195. for(ae = (AddressEntry *)euc.Addresses.lh_Head;
  196. ae->Node.ln_Succ;
  197. ae = (AddressEntry *)ae->Node.ln_Succ)
  198. {
  199. if(ae->Members &&
  200. !IsListEmpty(ae->Members))
  201. {
  202. AddressEntry *aem;
  203. for(aem = (AddressEntry *)ae->Members->lh_Head;
  204. aem->Node.ln_Succ;
  205. aem = (AddressEntry *)aem->Node.ln_Succ)
  206. {
  207. if(aem == aematch)
  208. return(ae);
  209. }
  210. }
  211. }
  212. return(NULL);
  213. }
  214. #endif