Guest User

Untitled

a guest
Oct 16th, 2013
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.13 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sysexits.h>
  5. #include <errno.h>
  6.  
  7. #define MAX_LEN 100
  8. #define MAX_NODE_LEN 1100000
  9. #define MAX_EDGE_LEN 40000
  10.  
  11. typedef struct nodes {
  12. char email[MAX_LEN + 1];
  13. } Node;
  14.  
  15. typedef struct edges {
  16. Node sender, receiver;
  17. } Edge;
  18.  
  19. Node nodes_list[MAX_NODE_LEN + 1];
  20. Edge edges_list[MAX_EDGE_LEN + 1];
  21. Node in_degree_list[MAX_NODE_LEN + 1];
  22.  
  23. int compare(const void *a, const void *b) {
  24. const Node *a_node = a;
  25. const Node *b_node = b;
  26. return strcmp(a_node->email, b_node->email);
  27. }
  28.  
  29. void list_emails(int size) {
  30. int i = 0;
  31. for (i = 0; i < size; i++) {
  32. printf("%s\n", nodes_list[i].email);
  33. }
  34. }
  35.  
  36. void show_email_information(int size, char email[]) {
  37. Node temp;
  38. char temp_email[MAX_LEN + 1];
  39. char override[MAX_LEN + 1] = "";
  40. int in_count = 0;
  41. int out_count = 0;
  42. int in_degree = 0;
  43. int i = 0;
  44. int in_degree_index = 0;
  45. int result = 0;
  46.  
  47. for (i = 0; i < size; i++) {
  48. if (strcmp(edges_list[i].receiver.email, email) == 0) {
  49. in_count++;
  50. result = search_in_degree_list(in_degree_index, edges_list[i].sender.email);
  51. if (result == 0) {
  52. strcpy(temp_email, override);
  53. strcpy(temp.email, override);
  54. strcpy(temp_email, edges_list[i].sender.email);
  55. strcpy(temp.email, temp_email);
  56. in_degree_list[in_degree_index] = temp;
  57. in_degree_index++;
  58. in_degree++;
  59. qsort(in_degree_list, in_degree_index, sizeof(Node), compare);
  60. }
  61. }
  62. if (strcmp(edges_list[i].sender.email, email) == 0) {
  63. out_count++;
  64. }
  65. }
  66.  
  67. printf("%s in_count: %d out_count: %d in_degree: %d\n", email, in_count, out_count, in_degree);
  68. }
  69.  
  70. int search(int size, char target_email[]) {
  71. int first = 0;
  72. int last = size - 1;
  73. int middle = (first + last) / 2;
  74.  
  75. while (first <= last) {
  76. if (strcmp(nodes_list[middle].email, target_email) < 0) {
  77. first = middle + 1;
  78. } else if (strcmp(nodes_list[middle].email, target_email) == 0) {
  79. return 1;
  80. break;
  81. } else {
  82. last = middle - 1;
  83. }
  84. middle = (first + last) / 2;
  85. }
  86.  
  87. if (first > last) {
  88. return 0;
  89. } else {
  90. return 9;
  91. }
  92. }
  93.  
  94. int search_in_degree_list(int size, char target_email[]) {
  95. int first = 0;
  96. int last = size - 1;
  97. int middle = (first + last) / 2;
  98.  
  99. while (first <= last) {
  100. if (strcmp(in_degree_list[middle].email, target_email) < 0) {
  101. first = middle + 1;
  102. } else if (strcmp(in_degree_list[middle].email, target_email) == 0) {
  103. return 1;
  104. break;
  105. } else {
  106. last = middle - 1;
  107. }
  108. middle = (first + last) / 2;
  109. }
  110.  
  111. if (first > last) {
  112. return 0;
  113. } else {
  114. return 9;
  115. }
  116. }
  117.  
  118. int main(int argc, char **argv) {
  119. FILE *stream;
  120. char input1[MAX_LEN + 1];
  121. char input2[MAX_LEN + 1];
  122. char filename[MAX_LEN + 1];
  123. char line[MAX_LEN + 1];
  124. char sender_username[MAX_LEN + 1];
  125. char sender_hostname[MAX_LEN + 1];
  126. char receiver_username[MAX_LEN + 1];
  127. char receiver_hostname[MAX_LEN + 1];
  128. char sender_email[MAX_LEN + 1];
  129. char receiver_email[MAX_LEN + 1];
  130. char override[MAX_LEN + 1] = "";
  131. int scanner = 0;
  132.  
  133. Node sender;
  134. Node receiver;
  135. Edge edge;
  136.  
  137. int nodes_list_index = 0;
  138. int edges_list_index = 0;
  139.  
  140. int added = 0;
  141. int hold = 0;
  142.  
  143. if (argc == 1) {
  144. printf("Enter file name: ");
  145. scanf("%s", filename);
  146. if (!(stream = fopen(filename, "r"))) {
  147. perror("Error opening file. Please try again and enter proper filename");
  148. exit(EXIT_FAILURE);
  149. }
  150. } else if (argc == 2) {
  151. stream = fopen(argv[1], "r");
  152. if (stream == NULL) {
  153. fprintf(stderr, "File %s open failed. Error %s\n", argv[1], strerror(errno));
  154. return EX_OSERR;
  155. }
  156. }
  157.  
  158. while (fgets(line, MAX_LEN + 1, stream) != NULL) {
  159. if (sscanf(line, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender_username, sender_hostname, receiver_username, receiver_hostname) != 4) {
  160. continue;
  161. } else {
  162. strcpy(sender_email, override);
  163. strcpy(receiver_email, override);
  164. strcpy(sender_email, (strcat(strcat(sender_username, "@"), sender_hostname)));
  165. strcpy(receiver_email, (strcat(strcat(receiver_username, "@"), receiver_hostname)));
  166. if (nodes_list_index == 0) {
  167. strcpy(sender.email, sender_email);
  168. nodes_list[nodes_list_index] = sender;
  169. strcpy(receiver.email, receiver_email);
  170. nodes_list[nodes_list_index + 1] = receiver;
  171. edge.sender = sender;
  172. edge.receiver = receiver;
  173. edges_list[edges_list_index] = edge;
  174. nodes_list_index = nodes_list_index + 2;
  175. edges_list_index++;
  176. added = added + 2;
  177. qsort(nodes_list, added, sizeof(Node), compare);
  178. } else {
  179. if (search(added, sender_email) == 0) {
  180. strcpy(sender.email, override);
  181. strcpy(sender.email, sender_email);
  182. nodes_list[nodes_list_index] = sender;
  183. nodes_list_index++;
  184. added++;
  185. qsort(nodes_list, added, sizeof(Node), compare);
  186. }
  187.  
  188. if (search(added, receiver_email) == 0) {
  189. strcpy(receiver.email, override);
  190. strcpy(receiver.email, receiver_email);
  191. nodes_list[nodes_list_index] = receiver;
  192. nodes_list_index++;
  193. added++;
  194. qsort(nodes_list, added, sizeof(Node), compare);
  195. }
  196.  
  197. strcpy(sender.email, override);
  198. strcpy(receiver.email, override);
  199. strcpy(sender.email, sender_email);
  200. strcpy(receiver.email, receiver_email);
  201. edge.sender = sender;
  202. edge.receiver = receiver;
  203. edges_list[edges_list_index] = edge;
  204. edges_list_index++;
  205. }
  206. }
  207. } /* End of while */
  208.  
  209. fclose(stream);
  210.  
  211. while (hold == 0) {
  212. scanner = scanf("%s", input1);
  213. if (strcmp(input1, "list") == 0) {
  214. list_emails(added);
  215. } else if (strcmp(input1, "quit") == 0 || scanner == 0) {
  216. break;
  217. } else if (strcmp(input1, "show") == 0) {
  218. scanf(" %s", input2);
  219. show_email_information(edges_list_index, input2);
  220. }
  221. }
  222. return 0;
  223. } /* End of main */
Advertisement
Add Comment
Please, Sign In to add comment