sms_list.c
上传用户:mei_mei897
上传日期:2007-01-05
资源大小:82k
文件大小:9k
源码类别:

手机短信编程

开发平台:

Unix_Linux

  1. /* -------------------------------------------------------------------- */
  2. /* SMS Client, send messages to mobile phones and pagers */
  3. /* */
  4. /* sms_list.c */
  5. /* */
  6. /*  Copyright (C) 1997,1998 Angelo Masci */
  7. /* */
  8. /*  This library is free software; you can redistribute it and/or */
  9. /*  modify it under the terms of the GNU Library General Public */
  10. /*  License as published by the Free Software Foundation; either */
  11. /*  version 2 of the License, or (at your option) any later version. */
  12. /* */
  13. /*  This library is distributed in the hope that it will be useful, */
  14. /*  but WITHOUT ANY WARRANTY; without even the implied warranty of */
  15. /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU */
  16. /*  Library General Public License for more details. */
  17. /* */
  18. /*  You should have received a copy of the GNU Library General Public */
  19. /*  License along with this library; if not, write to the Free */
  20. /*  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
  21. /* */
  22. /*  You can contact the author at this e-mail address: */
  23. /* */
  24. /*  angelo@styx.demon.co.uk */
  25. /* */
  26. /* -------------------------------------------------------------------- */
  27. /* $Id: sms_list.c,v 5.1 1998/02/01 07:10:39 root Exp $
  28.    -------------------------------------------------------------------- */
  29. #include <stdio.h>
  30. #include <ctype.h>
  31. #include <string.h>
  32. #include <stdlib.h>
  33. #include <limits.h>
  34. #include <sys/types.h>
  35. #include <unistd.h>
  36. #include "sms_list.h"
  37. #include "sms_error.h"
  38. #include "logfile.h"
  39. #include "common.h"
  40. /* -------------------------------------------------------------------- */
  41. /* -------------------------------------------------------------------- */
  42. #if 0
  43. SMS_list *insert_list(SMS_list *main_list, SMS_list *list)
  44. {
  45. SMS_list
  46. *node;
  47. if (list == NULL)
  48. { return main_list;
  49. }
  50. if (main_list == NULL)
  51. { return list;
  52. }
  53. node = list;
  54. while(node->next != NULL)
  55. { node = node->next;
  56. }
  57. node->next = main_list->next;
  58. main_list->next = list;
  59. return main_list;
  60. }
  61. #else
  62. SMS_list *insert_list(SMS_list *main_list, SMS_list *list)
  63. {
  64. SMS_list
  65. *node;
  66. if (list == NULL)
  67. { return main_list;
  68. }
  69. if (main_list == NULL)
  70. { return list;
  71. }
  72. node = list;
  73. while(node->next != NULL)
  74. { node = node->next;
  75. }
  76. node->next = main_list;
  77. return list;
  78. }
  79. #endif
  80. /* -------------------------------------------------------------------- */
  81. /* -------------------------------------------------------------------- */
  82. SMS_parent_list *find_list(SMS_parent_list *list, char *service)
  83. {
  84. SMS_parent_list
  85. *node;
  86. node = get_first_parent(list);
  87. while (node != NULL)
  88. {
  89. if (strcmp(node->child->service, service) == 0)
  90. {
  91. return node;
  92. }
  93. node = get_next_parent(node);
  94. }
  95. return NULL;
  96. }
  97. /* -------------------------------------------------------------------- */
  98. /* -------------------------------------------------------------------- */
  99. static void free_node(SMS_list *node)
  100. {
  101. free(node->name);
  102. free(node->service);
  103. free(node->number);
  104. free(node);
  105. }
  106. /* -------------------------------------------------------------------- */
  107. /* -------------------------------------------------------------------- */
  108. SMS_list *add_item(SMS_list *list, char *name, char *service, char *number)
  109. {
  110. SMS_list
  111. *node;
  112. node = (SMS_list *)malloc(sizeof(SMS_list));
  113. if (node == NULL)
  114. {
  115. lprintf(LOG_ERROR, "Allocating memoryn");
  116. exit(EMALLOC);
  117. }
  118. node->name = (char *)malloc(sizeof(char) * (sms_strlen(name) +1));
  119. if (node->name == NULL)
  120. {
  121. lprintf(LOG_ERROR, "Allocating memoryn");
  122. exit(EMALLOC);
  123. }
  124. sms_strcpy(node->name, name);
  125. node->service = (char *)malloc(sizeof(char) * (sms_strlen(service) +1));
  126. if (node->service == NULL)
  127. {
  128. lprintf(LOG_ERROR, "Allocating memoryn");
  129. exit(EMALLOC);
  130. }
  131. sms_strcpy(node->service, service);
  132. node->number = (char *)malloc(sizeof(char) * (sms_strlen(number) +1));
  133. if (node->number == NULL)
  134. {
  135. lprintf(LOG_ERROR, "Allocating memoryn");
  136. exit(EMALLOC);
  137. }
  138. sms_strcpy(node->number, number);
  139. node->delivery = -1;
  140. if (list == NULL)
  141. {
  142. node->next = NULL;
  143. return node;
  144. }
  145. node->next = list->next;
  146. list->next = node;
  147. return list;
  148. }
  149. /* -------------------------------------------------------------------- */
  150. /* -------------------------------------------------------------------- */
  151. SMS_list *dupnode(SMS_list *node)
  152. {
  153. SMS_list
  154. *new_node;
  155. new_node = add_item(NULL, node->name, node->service, node->number);
  156. new_node->delivery = node->delivery;
  157. return new_node;
  158. }
  159. /* -------------------------------------------------------------------- */
  160. /* -------------------------------------------------------------------- */
  161. SMS_list *get_first(SMS_list *node)
  162. {
  163. return node;
  164. }
  165. /* -------------------------------------------------------------------- */
  166. /* -------------------------------------------------------------------- */
  167. SMS_list *get_next(SMS_list *node)
  168. {
  169. if (node == NULL)
  170. { return NULL;
  171. }
  172. return node->next;
  173. }
  174. /* -------------------------------------------------------------------- */
  175. /* -------------------------------------------------------------------- */
  176. SMS_parent_list *add_item_parent(SMS_parent_list *list, SMS_list *child)
  177. {
  178. SMS_parent_list
  179. *node;
  180. node = (SMS_parent_list *)malloc(sizeof(SMS_parent_list));
  181. if (node == NULL)
  182. {
  183. lprintf(LOG_ERROR, "Allocating memoryn");
  184. exit(EMALLOC);
  185. }
  186. node->child = child;
  187. if (list == NULL)
  188. {
  189. node->next = NULL;
  190. return node;
  191. }
  192. node->next = list->next;
  193. list->next = node;
  194. return list;
  195. }
  196. /* -------------------------------------------------------------------- */
  197. /* -------------------------------------------------------------------- */
  198. SMS_parent_list *get_first_parent(SMS_parent_list *node)
  199. {
  200. return node;
  201. }
  202. /* -------------------------------------------------------------------- */
  203. /* -------------------------------------------------------------------- */
  204. SMS_parent_list *get_next_parent(SMS_parent_list *node)
  205. {
  206. if (node == NULL)
  207. { return NULL;
  208. }
  209. return node->next;
  210. }
  211. /* -------------------------------------------------------------------- */
  212. /* -------------------------------------------------------------------- */
  213. SMS_list *get_child(SMS_parent_list *node)
  214. {
  215. if (node == NULL)
  216. { return NULL;
  217. }
  218. return node->child;
  219. }
  220. /* -------------------------------------------------------------------- */
  221. /* -------------------------------------------------------------------- */
  222. char *get_number(SMS_list *node)
  223. {
  224. if (node == NULL)
  225. { return NULL;
  226. }
  227. return node->number;
  228. }
  229. /* -------------------------------------------------------------------- */
  230. /* -------------------------------------------------------------------- */
  231. char *get_name(SMS_list *node)
  232. {
  233. if (node == NULL)
  234. { return NULL;
  235. }
  236. return node->name;
  237. }
  238. /* -------------------------------------------------------------------- */
  239. /* -------------------------------------------------------------------- */
  240. char *get_service(SMS_list *node)
  241. {
  242. if (node == NULL)
  243. { return NULL;
  244. }
  245. return node->service;
  246. }
  247. /* -------------------------------------------------------------------- */
  248. /* -------------------------------------------------------------------- */
  249. void set_delivery(SMS_list *node, int delivery)
  250. {
  251. if (node == NULL)
  252. { return;
  253. }
  254. node->delivery = delivery;
  255. }
  256. /* -------------------------------------------------------------------- */
  257. /* -------------------------------------------------------------------- */
  258. int get_delivery(SMS_list *node)
  259. {
  260. if (node == NULL)
  261. { return 0;
  262. }
  263. return node->delivery;
  264. }
  265. /* -------------------------------------------------------------------- */
  266. /* -------------------------------------------------------------------- */
  267. void free_list(SMS_list *list)
  268. {
  269. SMS_list
  270. *node,
  271. *next;
  272. node = list;
  273. while (node != NULL)
  274. {
  275. next = node->next;
  276. free_node(node);
  277. node = next;
  278. }
  279. }
  280. /* -------------------------------------------------------------------- */
  281. /* -------------------------------------------------------------------- */
  282. SMS_list *find_number(SMS_list *list, char *str)
  283. {
  284. SMS_list
  285. *node;
  286. node = get_first(list);
  287. while (node != NULL)
  288. {
  289. if (strcmp(get_number(node), str) == 0)
  290. { return node;
  291. }
  292. node = get_next(node);
  293. }
  294. return NULL;
  295. }
  296. /* -------------------------------------------------------------------- */
  297. /* Gather all items that contain identical */
  298. /* services and generates a lists of lists containing */
  299. /* identical items */
  300. /* Example: */
  301. /* */
  302. /* |-- Type A */
  303. /* |-- Type C */
  304. /* |-- Type B */
  305. /* |-- Type C */
  306. /* |-- Type A */
  307. /* |-- Type A */
  308. /* */
  309. /* Becomes: */
  310. /* */
  311. /* | */
  312. /* |-------|-- Type A */
  313. /* |       |-- Type A */
  314. /* |       |-- Type A */
  315. /* | */
  316. /* |-------|-- Type B */
  317. /* | */
  318. /* |-------|-- Type C */
  319. /*         |-- Type C */
  320. /* */
  321. /* -------------------------------------------------------------------- */
  322. SMS_parent_list *gather(SMS_list *list)
  323. {
  324. SMS_parent_list 
  325. *parent_list,
  326. *found_list;
  327. SMS_list 
  328. *node,
  329. *new_node;
  330. parent_list = NULL;
  331. node = get_first(list);
  332. while (node != NULL)
  333. {
  334. new_node   = dupnode(node);
  335. found_list = find_list(parent_list, get_service(node)); 
  336. if (found_list == NULL)
  337. {
  338. found_list = add_item_parent(NULL, new_node);
  339. found_list->next = parent_list;
  340. parent_list = found_list;
  341. }
  342. else
  343. { list = insert_list(found_list->child, new_node);
  344. found_list->child = list;
  345. }
  346. node = get_next(node);
  347. }
  348. return parent_list;
  349. }