Advertisement
Guest User

Untitled

a guest
Mar 18th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.57 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <sys/mman.h>
  3. #include <sys/stat.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <ctype.h>
  8.  
  9. #define ARGS_NUM 4
  10.  
  11. typedef struct Field {
  12.     const char *name;
  13.     int is_found;
  14.     char *value;
  15. } Field;
  16.  
  17. void Field_show(const Field *field) {
  18.     printf("Field: %s\nValue: ", field->name);
  19.     if (field->is_found) {
  20.         printf("%s\n", field->value);
  21.     } else {
  22.         printf("VALUE NOT FOUND\n");
  23.     }
  24. }
  25.  
  26. size_t how_many_includes(const char *source, const char *str) {
  27.     size_t how_many = 0;
  28.     const char *iterator = source;
  29.  
  30.     while ((iterator = strstr(iterator, str))) {
  31.         iterator += strlen(str);
  32.         ++how_many;
  33.     }
  34.  
  35.     how_many -= 2;
  36.  
  37.     return how_many;
  38. }
  39. int main(int argc, const char **argv) {
  40.     if (argc != 2) {
  41.         //return 1;
  42.     }
  43.  
  44.     const char *path_to_eml = argv[1];
  45.  
  46.     FILE *f = fopen(path_to_eml, "r");
  47.     if (!f) {
  48.         return 2;
  49.     }
  50.  
  51.     struct stat st;
  52.     if (fstat(fileno(f), &st) != 0) {
  53.         printf("fstat failed: %s", strerror(errno));
  54.  
  55.         return 3;
  56.     }
  57.  
  58.     const char *letter = mmap(
  59.             NULL,
  60.             st.st_size,
  61.             PROT_READ,
  62.             MAP_FILE | MAP_PRIVATE,
  63.             fileno(f),
  64.             0);
  65.  
  66.     if (letter == MAP_FAILED) {
  67.         printf("mmap failed: %s", strerror(errno));
  68.  
  69.         return 4;
  70.     }
  71.  
  72.     Field args_find[] = {
  73.             {
  74.                     .name = "from: ",
  75.                     .is_found = 0
  76.             },
  77.             {
  78.                     .name = "to: ",
  79.                     .is_found = 0
  80.             },
  81.             {
  82.                     .name = "date: ",
  83.                     .is_found = 0
  84.             },
  85.             {
  86.                     .name = "boundary=",
  87.                     .is_found = 0
  88.             }
  89.     };
  90.  
  91.     const char *title_end = letter + st.st_size;
  92.     const char *title_ends[] = {"\n\n", "\n\r\n\r", "\r\n\r\n"};
  93.  
  94.     for (size_t i = 0; i < 3; ++i) {
  95.         const char *temp = strstr(letter, title_ends[i]);
  96.         if(temp != NULL && temp < title_end) {
  97.             title_end = temp;
  98.         }
  99.     }
  100.  
  101.     char *lower_title = malloc(sizeof(char) * (title_end - letter + 1));
  102.     for (size_t i = 0;  letter + i < title_end; ++i) {
  103.         lower_title[i] = (char)tolower(letter[i]);
  104.     }
  105.     lower_title[title_end - letter] = '\0';
  106.  
  107.     for (size_t i = 0; i < ARGS_NUM; ++i) {
  108.         const char *arg_begin = strstr(lower_title, args_find[i].name);
  109.  
  110.         if (i < 3) {
  111.             while (arg_begin != NULL && arg_begin > lower_title && *(arg_begin - 1) != '\n' && *(arg_begin - 1) != '\r') {
  112.                 arg_begin = strstr(arg_begin + 1, args_find[i].name);
  113.             }
  114.         }
  115.  
  116.         if(arg_begin != NULL) {
  117.             arg_begin = letter + (arg_begin - lower_title);
  118.         }
  119.  
  120.         if (!arg_begin) {
  121.             //printf("\"%s\" search failed.\n", args_find[i].name);
  122.  
  123.             continue;
  124.         }
  125.  
  126.         arg_begin += strlen(args_find[i].name);
  127.         if ((i == 3 && *arg_begin == '\"')|| *arg_begin == ' ') {
  128.             ++arg_begin;
  129.         }
  130.  
  131.         const char *arg_end = arg_begin;
  132.         while (*arg_end != '\n' && *arg_end != '\r' && *arg_end != ';') {
  133.             if (i == 3 && *arg_end == '\"') {
  134.                 break;
  135.             }
  136.             ++arg_end;
  137.         }
  138.  
  139.  
  140.         // printf("|\n");
  141.  
  142.         size_t arg_size = arg_end - arg_begin;
  143.  
  144.         args_find[i].value = malloc(sizeof(char) * arg_size + 1);  // TODO(Tony_Sysoev): make a mem_alloc check
  145.         strncpy(args_find[i].value , arg_begin, arg_size);         // ...and other checks
  146.         args_find[i].value[arg_size] = '\0';
  147.  
  148.         args_find[i].is_found = 1;
  149.     }
  150.  
  151.     for (size_t i = 0; i < ARGS_NUM - 1; ++i) {
  152.         if(args_find[i].is_found) {
  153.             printf("%s",args_find[i].value);
  154.         }
  155.  
  156.         printf("|");
  157.     }
  158.  
  159.     size_t parts = 0;
  160.     if (args_find[3].is_found) {
  161.         parts += how_many_includes(letter, args_find[3].value);
  162.     } else {    // FIX
  163.         const char *iterator = title_end;
  164.         while(iterator != '\0') {
  165.             ++iterator;
  166.             if (*iterator != '\n' && *iterator != '\r') {
  167.                 parts = 1;
  168.  
  169.                 break;
  170.             }
  171.         }
  172.     }       // ENDFIX
  173.     printf("%zu", parts);
  174.  
  175.     for (size_t i = 0; i < ARGS_NUM; ++i) {
  176.         if (args_find[i].is_found) {
  177.             free(args_find[i].value);
  178.         }
  179.     }
  180.  
  181.     free(lower_title);
  182.  
  183.     munmap((void *)letter, st.st_size);
  184.  
  185.     fclose(f);
  186.  
  187.     return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement