/* Zad4.c */ /* Jasmina Strizak */ #include int UporediChar(char x, char y) { if ((64 < x) && (x < 91)) x += 32; if ((64 < y) && (y < 91)) y += 32; if (x == y) return 0; else return 1; } int UporediString(char *x, char *y) { int i = 0; while ((UporediChar(x[i], y[i]) == 0) && ((x[i] != '\0') && (y[i] != '\0'))) { i++; } if ((x[i] == '\0') && (y[i] == '\0')) { return 0; /* x == y */ } else { return 1; /* x != y */ } } void iso8859_2(FILE *Ulaz, FILE *Izlaz) { /* Deklaracije promenljivih */ int i; int j; char c; char d; char s[256]; char s1[256]; /* Deklaracije promenljivih tabele */ int td; int tb[10]; char* tv[10]; /* Inicijalizacija promenljivih tabele */ td = 10; tb[0] = 0xC8; tv[0] = "&Cx;"; tb[1] = 0xD0; tv[1] = "&Dx;"; tb[2] = 0xAE; tv[2] = "&Zx;"; tb[3] = 0xC6; tv[3] = "&Cy;"; tb[4] = 0xA9; tv[4] = "&Sx;"; tb[5] = 0xE8; tv[5] = "&cx;"; tb[6] = 0xF0; tv[6] = "&dx;"; tb[7] = 0xBE; tv[7] = "&zx;"; tb[8] = 0xE6; tv[8] = "&cy;"; tb[9] = 0xB9; tv[9] = "&sx;"; /* Resetuje ulazni fajl */ fseek(Ulaz, 0, SEEK_SET); /* Konvertovanje */ while (! feof(Ulaz)) { c = fgetc(Ulaz); if (c == EOF) return; if (c == '<') { fprintf(Izlaz, "<"); /* Obrada etikete */ i = 0; c = fgetc(Ulaz); while (((c != ' ') && (c != '>')) && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Ispis stringa u Izlaz */ fprintf(Izlaz, "%s%c", s, c); /* Da li je procitana etiketa META ? */ if (UporediString(s, "META") == 0) { /* Citanje sadrzaja META etikete */ i = 0; c = fgetc(Ulaz); while ((c != '>') && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Traganje za "charset" */ i = 0; while (s[i] != '\0') { if (UporediChar(s[i], 'c') == 0) { /* Kopiranje stringa koji pocinje sa c */ j = 0; while ((s[i] != '\0') && (s[i] != '=') && (s[i] != ' ')) { s1[j] = s[i]; i++; j++; } s1[j] = '\0'; /* Stampanje procitanog stringa */ fprintf(Izlaz, "%s%c", s1, s[i]); i++; /* Da li procitani string == "charset" ? */ if (UporediString(s1, "charset") == 0) { /* Preskakanje kodne stranice */ j = 0; /* Ispis separatora */ while ((s[i] == '=') || (s[i] == ' ') || (s[i] == '"')) { fputc(s[i], Izlaz); i++; } while ((s[i] != '\0') && (s[i] != ' ') && (s[i] != '"')) { i++; } /* Ispis kodne stranice */ fprintf(Izlaz, "iso-8859-1"); /* Ispis ostatka */ while (s[i] != '\0') { fputc(s[i], Izlaz); i++; } } } else { /* Stampanje znaka koji je != 'c' */ fputc(s[i], Izlaz); i++; } } fprintf(Izlaz, ">"); } } else { /* printf("%d\n", c); */ /* Konverzija znaka */ j = 0; for (i = 0 ; i < td ; i++ ) { if (c == (char)tb[i]) { j = 1; fprintf(Izlaz, "%s", tv[i]); } } /* Konverzija nije izvrsena */ if (j == 0) { /* Da li je trenutni znak potencijalno 'nj' ili 'lj' ? */ if ((UporediChar(c, 'n') == 0) || (UporediChar(c, 'l') == 0)) { d = fgetc(Ulaz); /* Da li trenutni znak sa predhodnim gradi 'nj' ili 'lj' ? */ if (UporediChar(d, 'j') == 0) { fprintf(Izlaz, "&%cx;", c); j = 1; } else { /* Vracanje znaka koji nije 'j' */ ungetc(d, Ulaz); } } /* Da li je trenutni znak potencijalno 'dz' ? */ if (UporediChar(c, 'd') == 0) { d = fgetc(Ulaz); /* Da li trenutni znak sa predhodnim gradi 'dz' ? */ if (UporediChar(d, 'z') == 0) { fprintf(Izlaz, "&%cy;", c); j = 1; } else { /* Vracenje znaka koji nije 'z' */ ungetc(d, Ulaz); } } /* Konverzija nije izvrsena */ if (j == 0) fputc(c, Izlaz); } } } } void iso8859_5(FILE *Ulaz, FILE *Izlaz) { /* Deklaracije promenljivih */ int i; int j; char c; char s[256]; char s1[256]; /* Deklaracije promenljivih tabele */ int td; int tb[60]; char* tv[60]; /* Inicijalizacija promenljivih tabele */ td = 60; tb[ 0] = 0xB0; tv[ 0] = "A"; tb[ 1] = 0xB1; tv[ 1] = "B"; tb[ 2] = 0xB2; tv[ 2] = "V"; tb[ 3] = 0xB3; tv[ 3] = "G"; tb[ 4] = 0xB4; tv[ 4] = "D"; tb[ 5] = 0xA2; tv[ 5] = "&Dx;"; tb[ 6] = 0xB5; tv[ 6] = "E"; tb[ 7] = 0xB6; tv[ 7] = "&Zx;"; tb[ 8] = 0xB7; tv[ 8] = "Z"; tb[ 9] = 0xB8; tv[ 9] = "I"; tb[10] = 0xA8; tv[10] = "J"; tb[11] = 0xBA; tv[11] = "K"; tb[12] = 0xBB; tv[12] = "L"; tb[13] = 0xA9; tv[13] = "&Lx;"; tb[14] = 0xBC; tv[14] = "M"; tb[15] = 0xBD; tv[15] = "N"; tb[16] = 0xAA; tv[16] = "&Nx;"; tb[17] = 0xBE; tv[17] = "O"; tb[18] = 0xBF; tv[18] = "P"; tb[19] = 0xC0; tv[19] = "R"; tb[20] = 0xC1; tv[20] = "S"; tb[21] = 0xC2; tv[21] = "T"; tb[22] = 0xAB; tv[22] = "&Cy;"; tb[23] = 0xC3; tv[23] = "U"; tb[24] = 0xC4; tv[24] = "F"; tb[25] = 0xC5; tv[25] = "H"; tb[26] = 0xC6; tv[26] = "C"; tb[27] = 0xC7; tv[27] = "&Cx;"; tb[28] = 0xAF; tv[28] = "&Dy;"; tb[29] = 0xC8; tv[29] = "&Sx;"; tb[30] = 0xD0; tv[30] = "a"; tb[31] = 0xD1; tv[31] = "b"; tb[32] = 0xD2; tv[32] = "v"; tb[33] = 0xD3; tv[33] = "g"; tb[34] = 0xD4; tv[34] = "d"; tb[35] = 0xF2; tv[35] = "&dx;"; tb[36] = 0xD5; tv[36] = "e"; tb[37] = 0xD6; tv[37] = "&zx;"; tb[38] = 0xD7; tv[38] = "z"; tb[39] = 0xD8; tv[39] = "i"; tb[40] = 0xF8; tv[40] = "j"; tb[41] = 0xDA; tv[41] = "k"; tb[42] = 0xDB; tv[42] = "l"; tb[43] = 0xF9; tv[43] = "&lx;"; tb[44] = 0xDC; tv[44] = "m"; tb[45] = 0xDD; tv[45] = "n"; tb[46] = 0xFA; tv[46] = "&nx;"; tb[47] = 0xDE; tv[47] = "o"; tb[48] = 0xDF; tv[48] = "p"; tb[49] = 0xE0; tv[49] = "r"; tb[50] = 0xE1; tv[50] = "s"; tb[51] = 0xE2; tv[51] = "t"; tb[52] = 0xFB; tv[52] = "&cy;"; tb[53] = 0xE3; tv[53] = "u"; tb[54] = 0xE4; tv[54] = "f"; tb[55] = 0xE5; tv[55] = "h"; tb[56] = 0xE6; tv[56] = "c"; tb[57] = 0xE7; tv[57] = "&cx;"; tb[58] = 0xFF; tv[58] = "&dy;"; tb[59] = 0xE8; tv[59] = "&sx;"; /* Resetuje ulazni fajl */ fseek(Ulaz, 0, SEEK_SET); /* Konvertovanje */ while (! feof(Ulaz)) { c = fgetc(Ulaz); if (c == EOF) return; if (c == '<') { fprintf(Izlaz, "<"); /* Obrada etikete */ i = 0; c = fgetc(Ulaz); while (((c != ' ') && (c != '>')) && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Ispis stringa u Izlaz */ fprintf(Izlaz, "%s%c", s, c); /* Da li je procitana etiketa META ? */ if (UporediString(s, "META") == 0) { /* Citanje sadrzaja META etikete */ i = 0; c = fgetc(Ulaz); while ((c != '>') && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Traganje za "charset" */ i = 0; while (s[i] != '\0') { if (UporediChar(s[i], 'c') == 0) { /* Kopiranje stringa koji pocinje sa c */ j = 0; while ((s[i] != '\0') && (s[i] != '=') && (s[i] != ' ')) { s1[j] = s[i]; i++; j++; } s1[j] = '\0'; /* Stampanje procitanog stringa */ fprintf(Izlaz, "%s%c", s1, s[i]); i++; /* Da li procitani string == "charset" ? */ if (UporediString(s1, "charset") == 0) { /* Preskakanje kodne stranice */ j = 0; /* Ispis separatora */ while ((s[i] == '=') || (s[i] == ' ') || (s[i] == '"')) { fputc(s[i], Izlaz); i++; } while ((s[i] != '\0') && (s[i] != ' ') && (s[i] != '"')) { i++; } /* Ispis kodne stranice */ fprintf(Izlaz, "iso-8859-1"); /* Ispis ostatka */ while (s[i] != '\0') { fputc(s[i], Izlaz); i++; } } } else { /* Stampanje znaka koji je != 'c' */ fputc(s[i], Izlaz); i++; } } fprintf(Izlaz, ">"); } } else { /* printf("%d\n", c); */ /* Konverzija znaka */ j = 0; for (i = 0 ; i < td ; i++ ) { if (c == (char)tb[i]) { j = 1; fprintf(Izlaz, "%s", tv[i]); } } if (j == 0) { fputc(c, Izlaz); } } } } void windows1250(FILE *Ulaz, FILE *Izlaz) { /* Deklaracije promenljivih */ int i; int j; char c; char d; char s[256]; char s1[256]; /* Deklaracije promenljivih tabele */ int td; int tb[10]; char* tv[10]; /* Inicijalizacija promenljivih tabele */ td = 10; tb[0] = 0xC8; tv[0] = "&Cx;"; tb[1] = 0xD0; tv[1] = "&Dx;"; tb[2] = 0x8E; tv[2] = "&Zx;"; tb[3] = 0xC6; tv[3] = "&Cy;"; tb[4] = 0x8A; tv[4] = "&Sx;"; tb[5] = 0xE8; tv[5] = "&cx;"; tb[6] = 0xF0; tv[6] = "&dx;"; tb[7] = 0x9E; tv[7] = "&zx;"; tb[8] = 0xE6; tv[8] = "&cy;"; tb[9] = 0x9A; tv[9] = "&sx;"; /* Resetuje ulazni fajl */ fseek(Ulaz, 0, SEEK_SET); /* Konvertovanje */ while (! feof(Ulaz)) { c = fgetc(Ulaz); if (c == EOF) return; if (c == '<') { fprintf(Izlaz, "<"); /* Obrada etikete */ i = 0; c = fgetc(Ulaz); while (((c != ' ') && (c != '>')) && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Ispis stringa u Izlaz */ fprintf(Izlaz, "%s%c", s, c); /* Da li je procitana etiketa META ? */ if (UporediString(s, "META") == 0) { /* Citanje sadrzaja META etikete */ i = 0; c = fgetc(Ulaz); while ((c != '>') && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Traganje za "charset" */ i = 0; while (s[i] != '\0') { if (UporediChar(s[i], 'c') == 0) { /* Kopiranje stringa koji pocinje sa c */ j = 0; while ((s[i] != '\0') && (s[i] != '=') && (s[i] != ' ')) { s1[j] = s[i]; i++; j++; } s1[j] = '\0'; /* Stampanje procitanog stringa */ fprintf(Izlaz, "%s%c", s1, s[i]); i++; /* Da li procitani string == "charset" ? */ if (UporediString(s1, "charset") == 0) { /* Preskakanje kodne stranice */ j = 0; /* Ispis separatora */ while ((s[i] == '=') || (s[i] == ' ') || (s[i] == '"')) { fputc(s[i], Izlaz); i++; } while ((s[i] != '\0') && (s[i] != ' ') && (s[i] != '"')) { i++; } /* Ispis kodne stranice */ fprintf(Izlaz, "iso-8859-1"); /* Ispis ostatka */ while (s[i] != '\0') { fputc(s[i], Izlaz); i++; } } } else { /* Stampanje znaka koji je != 'c' */ fputc(s[i], Izlaz); i++; } } fprintf(Izlaz, ">"); } } else { /* printf("%d\n", c); */ /* Konverzija znaka */ j = 0; for (i = 0 ; i < td ; i++ ) { if (c == (char)tb[i]) { j = 1; fprintf(Izlaz, "%s", tv[i]); } } /* Konverzija nije izvrsena */ if (j == 0) { /* Da li je procitani znak potencijalno 'nj' ili 'lj' ? */ if ((UporediChar(c, 'n') == 0) || (UporediChar(c, 'l') == 0)) { d = fgetc(Ulaz); /* Da li je trenutni znak sa predhodnim gradi 'nj' ili 'lj' ? */ if (UporediChar(d, 'j') == 0) { fprintf(Izlaz, "&%cx;", c); j = 1; } else { /* Vracanje znaka koji nije 'j' */ ungetc(d, Ulaz); } } /* Da li je trenutni znak potencijalno 'dz' ? */ if (UporediChar(c, 'd') == 0) { d = fgetc(Ulaz); /* Da li trenutni znak sa predhodnim gradi 'dz' ? */ if (UporediChar(d, 'z') == 0) { fprintf(Izlaz, "&%cy;", c); j = 1; } else { /* Vracanje znaka koji nije 'z' */ ungetc(d, Ulaz); } } /* Konverzija nije izvrsena */ if (j == 0) fputc(c, Izlaz); } } } } void windows1251(FILE *Ulaz, FILE *Izlaz) { /* Deklaracije promenljivih */ int i; int j; char c; char s[256]; char s1[256]; /* Deklaracije promenljivih tabele */ int td; int tb[60]; char* tv[60]; /* Inicijalizacija promenljivih tabele */ td = 60; tb[ 0] = 0xC0; tv[ 0] = "A"; tb[ 1] = 0xC1; tv[ 1] = "B"; tb[ 2] = 0xC2; tv[ 2] = "V"; tb[ 3] = 0xC3; tv[ 3] = "G"; tb[ 4] = 0xC4; tv[ 4] = "D"; tb[ 5] = 0x80; tv[ 5] = "&Dx;"; tb[ 6] = 0xC5; tv[ 6] = "E"; tb[ 7] = 0xC6; tv[ 7] = "&Zx;"; tb[ 8] = 0xC7; tv[ 8] = "Z"; tb[ 9] = 0xC8; tv[ 9] = "I"; tb[10] = 0xA3; tv[10] = "J"; tb[11] = 0xCA; tv[11] = "K"; tb[12] = 0xCB; tv[12] = "L"; tb[13] = 0x8A; tv[13] = "&Lx;"; tb[14] = 0xCC; tv[14] = "M"; tb[15] = 0xCD; tv[15] = "N"; tb[16] = 0x8C; tv[16] = "&Nx;"; tb[17] = 0xCE; tv[17] = "O"; tb[18] = 0xCF; tv[18] = "P"; tb[19] = 0xD0; tv[19] = "R"; tb[20] = 0xD1; tv[20] = "S"; tb[21] = 0xD2; tv[21] = "T"; tb[22] = 0x8E; tv[22] = "&Cy;"; tb[23] = 0xD3; tv[23] = "U"; tb[24] = 0xD4; tv[24] = "F"; tb[25] = 0xD5; tv[25] = "H"; tb[26] = 0xD6; tv[26] = "C"; tb[27] = 0xD7; tv[27] = "&Cx;"; tb[28] = 0x8F; tv[28] = "&Dy;"; tb[29] = 0xD8; tv[29] = "&Sx;"; tb[30] = 0xE0; tv[30] = "a"; tb[31] = 0xE1; tv[31] = "b"; tb[32] = 0xE2; tv[32] = "v"; tb[33] = 0xE3; tv[33] = "g"; tb[34] = 0xE4; tv[34] = "d"; tb[35] = 0x90; tv[35] = "&dx;"; tb[36] = 0xE5; tv[36] = "e"; tb[37] = 0xE6; tv[37] = "&zx;"; tb[38] = 0xE7; tv[38] = "z"; tb[39] = 0xE8; tv[39] = "i"; tb[40] = 0xBC; tv[40] = "j"; tb[41] = 0xEA; tv[41] = "k"; tb[42] = 0xEB; tv[42] = "l"; tb[43] = 0x9A; tv[43] = "&lx;"; tb[44] = 0xEC; tv[44] = "m"; tb[45] = 0xED; tv[45] = "n"; tb[46] = 0x9C; tv[46] = "&nx;"; tb[47] = 0xEE; tv[47] = "o"; tb[48] = 0xEF; tv[48] = "p"; tb[49] = 0xF0; tv[49] = "r"; tb[50] = 0xF1; tv[50] = "s"; tb[51] = 0xF2; tv[51] = "t"; tb[52] = 0x9E; tv[52] = "&cy;"; tb[53] = 0xF3; tv[53] = "u"; tb[54] = 0xF4; tv[54] = "f"; tb[55] = 0xF5; tv[55] = "h"; tb[56] = 0xF6; tv[56] = "c"; tb[57] = 0xF7; tv[57] = "&cx;"; tb[58] = 0x9F; tv[58] = "&dy;"; tb[59] = 0xF8; tv[59] = "&sx;"; /* Resetuje ulazni fajl */ fseek(Ulaz, 0, SEEK_SET); /* Konvertovanje */ while (! feof(Ulaz)) { c = fgetc(Ulaz); if (c == EOF) return; if (c == '<') { fprintf(Izlaz, "<"); /* Obrada etikete */ i = 0; c = fgetc(Ulaz); while (((c != ' ') && (c != '>')) && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Ispis stringa u Izlaz */ fprintf(Izlaz, "%s%c", s, c); /* Da li je procitana etiketa META ? */ if (UporediString(s, "META") == 0) { /* Citanje sadrzaja META etikete */ i = 0; c = fgetc(Ulaz); while ((c != '>') && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Traganje za "charset" */ i = 0; while (s[i] != '\0') { if (UporediChar(s[i], 'c') == 0) { /* Kopiranje stringa koji pocinje sa c */ j = 0; while ((s[i] != '\0') && (s[i] != '=') && (s[i] != ' ')) { s1[j] = s[i]; i++; j++; } s1[j] = '\0'; /* Stampanje procitanog stringa */ fprintf(Izlaz, "%s%c", s1, s[i]); i++; /* Da li procitani string == "charset" ? */ if (UporediString(s1, "charset") == 0) { /* Preskakanje kodne stranice */ j = 0; /* Ispis separatora */ while ((s[i] == '=') || (s[i] == ' ') || (s[i] == '"')) { fputc(s[i], Izlaz); i++; } while ((s[i] != '\0') && (s[i] != ' ') && (s[i] != '"')) { i++; } /* Ispis kodne stranice */ fprintf(Izlaz, "iso-8859-1"); /* Ispis ostatka */ while (s[i] != '\0') { fputc(s[i], Izlaz); i++; } } } else { /* Stampanje znaka koji je != 'c' */ fputc(s[i], Izlaz); i++; } } fprintf(Izlaz, ">"); } } else { /* printf("%d\n", c); */ /* Konverzija znaka */ j = 0; for (i = 0 ; i < td ; i++ ) { if (c == (char)tb[i]) { j = 1; fprintf(Izlaz, "%s", tv[i]); } } if (j == 0) { fputc(c, Izlaz); } } } } int main(int BrojArgumenata, char **SadrzajArgumenta) { /* Deklaracije promenljivih */ int i; int j; char c; char s[256]; char s1[256]; char ks[256]; /* kodna stanica */ FILE *Ulaz; FILE *Izlaz; /* Provere argumenata */ if (BrojArgumenata < 3) { printf("Koriscenje: DEKODER Ulaz.HTM Izlaz.HTM\n"); return 1; /* Nisu navedeni svi argumenti */ } /* Inicijalizacije */ ks[0] = '\0'; /* Otvaranje fajlova */ Ulaz = fopen(SadrzajArgumenta[1], "rb"); Izlaz = fopen(SadrzajArgumenta[2], "wb"); /* Identifikovanje kodne stranice */ while (! feof(Ulaz)) { /* Citanje karaktera */ c = fgetc(Ulaz); if (c == '<') { /* Citanje etikete */ i = 0; c = fgetc(Ulaz); while (((c != ' ') && (c != '>')) && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Da li je procitana etiketa META ? */ if (UporediString(s, "META") == 0) { /* Citanje sadrzaja META etikete */ i = 0; c = fgetc(Ulaz); while ((c != '>') && (i < 255)) { s[i] = c; i++; c = fgetc(Ulaz); } s[i] = '\0'; /* Traganje za "charset" */ i = 0; while (s[i] != '\0') { if (UporediChar(s[i], 'c') == 0) { /* Kopiranje stringa koji pocinje sa c */ j = 0; while ((s[i] != '\0') && (s[i] != '=') && (s[i] != ' ')) { s1[j] = s[i]; i++; j++; } s1[j] = '\0'; /* Da li procitani string == "charset" ? */ if (UporediString(s1, "charset") == 0) { /* Citanje kodne stranice */ j = 0; /* Preskakanje separatora */ while ((s[i] == '=') || (s[i] == ' ') || (s[i] == '"')) { i++; } while ((s[i] != '\0') && (s[i] != ' ') && (s[i] != '"')) { ks[j] = s[i]; i++; j++; } ks[j] = '\0'; } } else { i++; } } } } } /* Ispis poruke */ if (ks[0] == '\0') { /* Greska */ printf("Informacija o kodnoj semi se ne nalazi u tekstu !\n"); } else { printf("Tekst je kodiran prema semi %s\n", ks); } /* Dekodiranje seme i rezultat upisuje u izlazni stream */ if (UporediString(ks, "iso-8859-2") == 0) { iso8859_2(Ulaz, Izlaz); } if (UporediString(ks, "iso-8859-5") == 0) { iso8859_5(Ulaz, Izlaz); } if (UporediString(ks, "windows-1250") == 0) { windows1250(Ulaz, Izlaz); } if (UporediString(ks, "windows-1251") == 0) { windows1251(Ulaz, Izlaz); } /* Zatvaranje fajlova */ fclose(Ulaz); fclose(Izlaz); /* Kraj */ return 0; }