Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sysexits.h>
- #include <errno.h>
- #define MAX_LEN 100
- #define MAX_NODE_LEN 1100000
- #define MAX_EDGE_LEN 40000
- typedef struct nodes {
- char email[MAX_LEN + 1];
- } Node;
- typedef struct edges {
- Node sender, receiver;
- } Edge;
- Node nodes_list[MAX_NODE_LEN + 1];
- Edge edges_list[MAX_EDGE_LEN + 1];
- Node in_degree_list[MAX_NODE_LEN + 1];
- int compare(const void *a, const void *b) {
- const Node *a_node = a;
- const Node *b_node = b;
- return strcmp(a_node->email, b_node->email);
- }
- void list_emails(int size) {
- int i = 0;
- for (i = 0; i < size; i++) {
- printf("%s\n", nodes_list[i].email);
- }
- }
- void show_email_information(int size, char email[]) {
- Node temp;
- char temp_email[MAX_LEN + 1];
- char override[MAX_LEN + 1] = "";
- int in_count = 0;
- int out_count = 0;
- int in_degree = 0;
- int i = 0;
- int in_degree_index = 0;
- int result = 0;
- for (i = 0; i < size; i++) {
- if (strcmp(edges_list[i].receiver.email, email) == 0) {
- in_count++;
- result = search_in_degree_list(in_degree_index, edges_list[i].sender.email);
- if (result == 0) {
- strcpy(temp_email, override);
- strcpy(temp.email, override);
- strcpy(temp_email, edges_list[i].sender.email);
- strcpy(temp.email, temp_email);
- in_degree_list[in_degree_index] = temp;
- in_degree_index++;
- in_degree++;
- qsort(in_degree_list, in_degree_index, sizeof(Node), compare);
- }
- }
- if (strcmp(edges_list[i].sender.email, email) == 0) {
- out_count++;
- }
- }
- printf("%s in_count: %d out_count: %d in_degree: %d\n", email, in_count, out_count, in_degree);
- }
- int search(int size, char target_email[]) {
- int first = 0;
- int last = size - 1;
- int middle = (first + last) / 2;
- while (first <= last) {
- if (strcmp(nodes_list[middle].email, target_email) < 0) {
- first = middle + 1;
- } else if (strcmp(nodes_list[middle].email, target_email) == 0) {
- return 1;
- break;
- } else {
- last = middle - 1;
- }
- middle = (first + last) / 2;
- }
- if (first > last) {
- return 0;
- } else {
- return 9;
- }
- }
- int search_in_degree_list(int size, char target_email[]) {
- int first = 0;
- int last = size - 1;
- int middle = (first + last) / 2;
- while (first <= last) {
- if (strcmp(in_degree_list[middle].email, target_email) < 0) {
- first = middle + 1;
- } else if (strcmp(in_degree_list[middle].email, target_email) == 0) {
- return 1;
- break;
- } else {
- last = middle - 1;
- }
- middle = (first + last) / 2;
- }
- if (first > last) {
- return 0;
- } else {
- return 9;
- }
- }
- int main(int argc, char **argv) {
- FILE *stream;
- char input1[MAX_LEN + 1];
- char input2[MAX_LEN + 1];
- char filename[MAX_LEN + 1];
- char line[MAX_LEN + 1];
- char sender_username[MAX_LEN + 1];
- char sender_hostname[MAX_LEN + 1];
- char receiver_username[MAX_LEN + 1];
- char receiver_hostname[MAX_LEN + 1];
- char sender_email[MAX_LEN + 1];
- char receiver_email[MAX_LEN + 1];
- char override[MAX_LEN + 1] = "";
- int scanner = 0;
- Node sender;
- Node receiver;
- Edge edge;
- int nodes_list_index = 0;
- int edges_list_index = 0;
- int added = 0;
- int hold = 0;
- if (argc == 1) {
- printf("Enter file name: ");
- scanf("%s", filename);
- if (!(stream = fopen(filename, "r"))) {
- perror("Error opening file. Please try again and enter proper filename");
- exit(EXIT_FAILURE);
- }
- } else if (argc == 2) {
- stream = fopen(argv[1], "r");
- if (stream == NULL) {
- fprintf(stderr, "File %s open failed. Error %s\n", argv[1], strerror(errno));
- return EX_OSERR;
- }
- }
- while (fgets(line, MAX_LEN + 1, stream) != NULL) {
- if (sscanf(line, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender_username, sender_hostname, receiver_username, receiver_hostname) != 4) {
- continue;
- } else {
- strcpy(sender_email, override);
- strcpy(receiver_email, override);
- strcpy(sender_email, (strcat(strcat(sender_username, "@"), sender_hostname)));
- strcpy(receiver_email, (strcat(strcat(receiver_username, "@"), receiver_hostname)));
- if (nodes_list_index == 0) {
- strcpy(sender.email, sender_email);
- nodes_list[nodes_list_index] = sender;
- strcpy(receiver.email, receiver_email);
- nodes_list[nodes_list_index + 1] = receiver;
- edge.sender = sender;
- edge.receiver = receiver;
- edges_list[edges_list_index] = edge;
- nodes_list_index = nodes_list_index + 2;
- edges_list_index++;
- added = added + 2;
- qsort(nodes_list, added, sizeof(Node), compare);
- } else {
- if (search(added, sender_email) == 0) {
- strcpy(sender.email, override);
- strcpy(sender.email, sender_email);
- nodes_list[nodes_list_index] = sender;
- nodes_list_index++;
- added++;
- qsort(nodes_list, added, sizeof(Node), compare);
- }
- if (search(added, receiver_email) == 0) {
- strcpy(receiver.email, override);
- strcpy(receiver.email, receiver_email);
- nodes_list[nodes_list_index] = receiver;
- nodes_list_index++;
- added++;
- qsort(nodes_list, added, sizeof(Node), compare);
- }
- strcpy(sender.email, override);
- strcpy(receiver.email, override);
- strcpy(sender.email, sender_email);
- strcpy(receiver.email, receiver_email);
- edge.sender = sender;
- edge.receiver = receiver;
- edges_list[edges_list_index] = edge;
- edges_list_index++;
- }
- }
- } /* End of while */
- fclose(stream);
- while (hold == 0) {
- scanner = scanf("%s", input1);
- if (strcmp(input1, "list") == 0) {
- list_emails(added);
- } else if (strcmp(input1, "quit") == 0 || scanner == 0) {
- break;
- } else if (strcmp(input1, "show") == 0) {
- scanf(" %s", input2);
- show_email_information(edges_list_index, input2);
- }
- }
- return 0;
- } /* End of main */
Advertisement
Add Comment
Please, Sign In to add comment