Advertisement
Guest User

Untitled

a guest
May 16th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. int days[][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  7.                  {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
  8.  
  9. char months[][10] = {"", "January", "February", "March", "April", "May", "June", "July",
  10.                     "August", "September", "October", "November", "December"};
  11.  
  12. char fkin_days[][5] = {"0th", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th",
  13.                        "11th", "12th", "13th", "14th", "15h", "16th", "17th", "18th", "19th", "20th", "21th",
  14.                        "22th", "23th", "24th", "25h", "26th", "27th", "28th", "29th", "30th", "31th"};
  15.  
  16. char dot = '.', comma = ',', space = ' ';
  17.  
  18. // ovo su sve konstanti izrazi; moze pametnije ovo sa danima, ali najjednostavnije je ovako
  19. // separator
  20.  
  21. void error() {
  22.     fputs("Not enough memory\n", stderr);
  23.     exit(EXIT_FAILURE);
  24. }
  25.  
  26. int check_date(char *s, int l, int r, int *d, int *m, int *y) {
  27.     /*
  28.         Godina je validna ako je:
  29.             -format korektan
  30.             -sve vrednosti pozitivne i smislene
  31.             -dani su pogodjeni u skladu sa mesecom i godinom
  32.     */
  33.  
  34.     *d = *m = *y = -1;
  35.     int prev = l, cnt_dots = 0;
  36.  
  37.     for (int i = l; i <= r; i++) {
  38.         if (s[i] == '.') {
  39.             cnt_dots++;
  40.  
  41.             if (*d == -1) *d = atoi(s + prev);
  42.             else *m = atoi(s + prev);
  43.  
  44.             prev = i + 1;
  45.         }
  46.         else if (!isdigit(s[i])) return 0;
  47.     }
  48.     *y = atoi(s + prev);
  49.  
  50.     if (cnt_dots != 2) return 0; // moraju dve tacke u formatu zapisa
  51.     if (*m > 12 || *m <= 0) return 0;
  52.     if (*d > 31 || *d <= 0) return 0;
  53.     if (*y < 0) return 0;
  54.  
  55.    
  56.     int leap = 0;
  57.     if (*y % 4 == 0 && *y % 100 != 0 || *y % 400 == 0) leap = 1;
  58.     if (days[leap][*m] - *d < 0) return 0;
  59.  
  60.     return 1;
  61. }
  62.  
  63. int digits(int x) {
  64.     if (!x) return 0;
  65.     return 1 + digits(x / 10);
  66. }
  67.  
  68. void fill_year(char *s, int i, int step, int year) { // upisivanje godine kao broja u string
  69.     if (step == -1) return;
  70.     s[i + step] = (year % 10) + '0';
  71.     fill_year(s, i, step - 1, year / 10);
  72. }
  73.  
  74. void process_strings(char **s, int k) {
  75.     int day, mon, year;
  76.  
  77.     for (int i = 0; i < k; i++) {
  78.         int len = strlen(s[i]), offset = 10; // ofset = 10 znaci da 10 karaktera sadrzi dd.mm.yyyy sa tackama
  79.  
  80.         for (int j = 0; j <= len - offset; j++) {
  81.             if (isdigit(s[i][j]) && check_date(s[i], j, j + offset - 1, &day, &mon, &year)) { // proveravamo da li je godina validna
  82.                 int aux_len = strlen(months[mon]) + strlen(fkin_days[day]) + digits(year) + 4; // 4 su dva razmaka, zarez i tacka
  83.                 char *lager = (char *)calloc(aux_len, 1); // lager sadrzi ovaj novi format datuma
  84.  
  85.                 int pos = 0;
  86.                 memcpy(lager, months[mon], strlen(months[mon]));
  87.                 pos += strlen(months[mon]);
  88.                
  89.                 memcpy(lager + pos, &space, 1);
  90.                 pos++;
  91.  
  92.                 memcpy(lager + pos, fkin_days[day], strlen(fkin_days[day]));
  93.                 pos += strlen(fkin_days[day]);
  94.                 memcpy(lager + pos, &comma, 1);
  95.                 pos++;
  96.  
  97.                 memcpy(lager + pos, &space, 1);
  98.                 pos++;
  99.  
  100.                 fill_year(lager, pos, 3, year);
  101.                 pos += 4;
  102.  
  103.                 memcpy(lager + pos, &dot, 1);
  104.  
  105.                 s[i] = (char *)realloc(s[i], len - offset + aux_len + 2);
  106.                 if (!s[i]) error();
  107.  
  108.                 char *aux_lager = (char *)calloc(len - j - offset + 2, 1); // pravimo novi lager zbog prepisa, da ne dodje do preklapanja
  109.                 if (!aux_lager) error();
  110.                
  111.                 if (len - j - offset + 2) memcpy(aux_lager, s[i] + j + offset, len - j - offset + 2);
  112.                 if (len - j - offset + 2) memcpy(s[i] + j + aux_len, aux_lager, len - j - offset + 2);
  113.                 memcpy(s[i] + j, lager, aux_len);
  114.                
  115.                 len = len - offset + aux_len; // azuriramo novu duzinu
  116.             }
  117.         }
  118.     }
  119. }
  120.  
  121. int main() {
  122.     char needle[] = "dosta Brus Li"; // KOME PALO NA PAMET DA ZAVRSI SA OVIM????????????
  123.  
  124.     int total_size = 0, k = 0;
  125.     int cur_idx = 0, cur_size = 0;
  126.     char **s = NULL, c;
  127.  
  128.     while (c = getchar()) { // klasicno C proseravanje
  129.         if (c == '\n') {
  130.             s[k] = (char *)realloc(s[k], cur_size + 1);
  131.             if (!s[k]) error();
  132.             s[k][cur_size] = 0;
  133.  
  134.             cur_idx = cur_size = 0;
  135.             k++;
  136.  
  137.             if (strcmp(s[k - 1], needle) == 0) break;
  138.         }
  139.         else {
  140.             if (k == total_size) {
  141.                 total_size++;
  142.  
  143.                 if (!s) s = (char **)calloc(1, sizeof(char *));
  144.                 else s = (char **)realloc(s, total_size * sizeof(char *));
  145.  
  146.                 if (!s) error();
  147.             }
  148.            
  149.             if (cur_idx == cur_size) {
  150.                 cur_size++;
  151.  
  152.                 if (!s[k]) s[k] = (char *)calloc(1, cur_size);
  153.                 else s[k] = (char *)realloc(s[k], cur_size);
  154.  
  155.                 if (!s[k]) error();
  156.             }
  157.            
  158.             s[k][cur_idx++] = c;
  159.         }
  160.     }
  161.  
  162.     for (int i = 0; i < k; i++) // pre transformacija
  163.        printf("%s\n", s[i]);
  164.  
  165.     process_strings(s, k);
  166.  
  167.     for (int i = 0; i < k; i++) // posle transformacija
  168.         printf("%s\n", s[i]);
  169.  
  170.    
  171.     for (int i = 0; i < k; i++) // clear phase
  172.         free(s[i]);
  173.     free(s);
  174.  
  175.     return 0;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement