Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- int days[][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
- {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
- char months[][10] = {"", "January", "February", "March", "April", "May", "June", "July",
- "August", "September", "October", "November", "December"};
- char fkin_days[][5] = {"0th", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th",
- "11th", "12th", "13th", "14th", "15h", "16th", "17th", "18th", "19th", "20th", "21th",
- "22th", "23th", "24th", "25h", "26th", "27th", "28th", "29th", "30th", "31th"};
- char dot = '.', comma = ',', space = ' ';
- // ovo su sve konstanti izrazi; moze pametnije ovo sa danima, ali najjednostavnije je ovako
- // separator
- void error() {
- fputs("Not enough memory\n", stderr);
- exit(EXIT_FAILURE);
- }
- int check_date(char *s, int l, int r, int *d, int *m, int *y) {
- /*
- Godina je validna ako je:
- -format korektan
- -sve vrednosti pozitivne i smislene
- -dani su pogodjeni u skladu sa mesecom i godinom
- */
- *d = *m = *y = -1;
- int prev = l, cnt_dots = 0;
- for (int i = l; i <= r; i++) {
- if (s[i] == '.') {
- cnt_dots++;
- if (*d == -1) *d = atoi(s + prev);
- else *m = atoi(s + prev);
- prev = i + 1;
- }
- else if (!isdigit(s[i])) return 0;
- }
- *y = atoi(s + prev);
- if (cnt_dots != 2) return 0; // moraju dve tacke u formatu zapisa
- if (*m > 12 || *m <= 0) return 0;
- if (*d > 31 || *d <= 0) return 0;
- if (*y < 0) return 0;
- int leap = 0;
- if (*y % 4 == 0 && *y % 100 != 0 || *y % 400 == 0) leap = 1;
- if (days[leap][*m] - *d < 0) return 0;
- return 1;
- }
- int digits(int x) {
- if (!x) return 0;
- return 1 + digits(x / 10);
- }
- void fill_year(char *s, int i, int step, int year) { // upisivanje godine kao broja u string
- if (step == -1) return;
- s[i + step] = (year % 10) + '0';
- fill_year(s, i, step - 1, year / 10);
- }
- void process_strings(char **s, int k) {
- int day, mon, year;
- for (int i = 0; i < k; i++) {
- int len = strlen(s[i]), offset = 10; // ofset = 10 znaci da 10 karaktera sadrzi dd.mm.yyyy sa tackama
- for (int j = 0; j <= len - offset; j++) {
- if (isdigit(s[i][j]) && check_date(s[i], j, j + offset - 1, &day, &mon, &year)) { // proveravamo da li je godina validna
- int aux_len = strlen(months[mon]) + strlen(fkin_days[day]) + digits(year) + 4; // 4 su dva razmaka, zarez i tacka
- char *lager = (char *)calloc(aux_len, 1); // lager sadrzi ovaj novi format datuma
- int pos = 0;
- memcpy(lager, months[mon], strlen(months[mon]));
- pos += strlen(months[mon]);
- memcpy(lager + pos, &space, 1);
- pos++;
- memcpy(lager + pos, fkin_days[day], strlen(fkin_days[day]));
- pos += strlen(fkin_days[day]);
- memcpy(lager + pos, &comma, 1);
- pos++;
- memcpy(lager + pos, &space, 1);
- pos++;
- fill_year(lager, pos, 3, year);
- pos += 4;
- memcpy(lager + pos, &dot, 1);
- s[i] = (char *)realloc(s[i], len - offset + aux_len + 2);
- if (!s[i]) error();
- char *aux_lager = (char *)calloc(len - j - offset + 2, 1); // pravimo novi lager zbog prepisa, da ne dodje do preklapanja
- if (!aux_lager) error();
- if (len - j - offset + 2) memcpy(aux_lager, s[i] + j + offset, len - j - offset + 2);
- if (len - j - offset + 2) memcpy(s[i] + j + aux_len, aux_lager, len - j - offset + 2);
- memcpy(s[i] + j, lager, aux_len);
- len = len - offset + aux_len; // azuriramo novu duzinu
- }
- }
- }
- }
- int main() {
- char needle[] = "dosta Brus Li"; // KOME PALO NA PAMET DA ZAVRSI SA OVIM????????????
- int total_size = 0, k = 0;
- int cur_idx = 0, cur_size = 0;
- char **s = NULL, c;
- while (c = getchar()) { // klasicno C proseravanje
- if (c == '\n') {
- s[k] = (char *)realloc(s[k], cur_size + 1);
- if (!s[k]) error();
- s[k][cur_size] = 0;
- cur_idx = cur_size = 0;
- k++;
- if (strcmp(s[k - 1], needle) == 0) break;
- }
- else {
- if (k == total_size) {
- total_size++;
- if (!s) s = (char **)calloc(1, sizeof(char *));
- else s = (char **)realloc(s, total_size * sizeof(char *));
- if (!s) error();
- }
- if (cur_idx == cur_size) {
- cur_size++;
- if (!s[k]) s[k] = (char *)calloc(1, cur_size);
- else s[k] = (char *)realloc(s[k], cur_size);
- if (!s[k]) error();
- }
- s[k][cur_idx++] = c;
- }
- }
- for (int i = 0; i < k; i++) // pre transformacija
- printf("%s\n", s[i]);
- process_strings(s, k);
- for (int i = 0; i < k; i++) // posle transformacija
- printf("%s\n", s[i]);
- for (int i = 0; i < k; i++) // clear phase
- free(s[i]);
- free(s);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement