/* autor: Milan Ruzic 394/2000 */ #include #define BufferSize 1000 #define MaxStrLen 20 /* majoranta duzina stringova koji ce biti pretrazivani u tekstu */ typedef struct {char srcStr[5], destStr[3];} Treplace_pair; /* ime samo kaze - ako se na odredjenom mestu u tekstu nalazi source string, bice zamenjen destination stringom */ int trenPos=BufferSize; /*trenutna pozicija u bufferu; globalna promenjiva omogucava korisnickim procedurama da povecaju poziciju za vise mesta ako je odgovarajuci string prepoznat ili da se eventualno vrate unazad */ char *Buffer_Read(void); int myStrCmp(char *s1,char *s2); /* ovde s1 ne mora da se zavrsava NULLom */ int myStriCmp(char *s1, char *s2); /* gleda se da li je neki prefiks od s1==s2 */ int toUpCase(int ch); /**************************************************************************/ char *Buffer_Read(void) /* vraca pointer na tren. poziciju u character bufferu i povecava trenPos za 1*/ {static char chBuffer[BufferSize]; if (trenPos*s2) return 1; else return -1; } int myStriCmp(char *s1,char *s2) {for (;toUpCase(*s1)==toUpCase(*s2) && *s2;s1++,s2++); if (!*s2) return 0; else if (toUpCase(*s1)>toUpCase(*s2)) return 1; else return -1; } /**************************************************************************/ #define LcodesNum 16 void iso8859_2(void) {Treplace_pair codes[LcodesNum]={"&Cx;","\xC8","&cx;","\xE8","&Cy;","\xC6","&cy;","\xE6", "&Dx;","\xD0","&dx;","\xF0","&Dy;","Dz","&dy;","dz","&Zx;","\xAE","&zx;","\xBE", "&Sx;","\xA9","&sx;","\xB9","&Lx;","Lj","&lx;","lj","&Nx;","Nj","&nx;","nj"}; char *trenStr, inTag=0; for (trenStr=Buffer_Read();*trenStr!=EOF;trenStr=Buffer_Read()) {char c=*trenStr; if (inTag) { putc(c,stdout); if (c=='>'|| c==']') inTag=0;} else if (c=='<'||c=='[') { putc(c,stdout); inTag=1;} else {int i; for (i=0;i*s2) return 1; else return -1; } /* posto u iso8859-5() treba ispitati malo vise stringova primenjuje binarna pretraga koja zahteva sortiran niz */ void qsort(Treplace_pair a[],int l,int r) {Treplace_pair temp; char mid[5]; int i,j=(l+r)>>1; for (i=0;i<=5;i++) mid[i]=a[j].srcStr[i]; i=l;j=r; do { for(;strCmp(a[i].srcStr,mid)<0;i++); for(;strCmp(a[j].srcStr,mid)>0;j--); if (i<=j) {temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--; } } while (i<=j); if (il) qsort(a,l,j); } #define CcodesNum 60 void iso8859_5(void) {Treplace_pair codes[CcodesNum]={"&Cx;","\xC7","&cx;","\xE7","&Cy;","\xAB","&cy;","\xFB", "&Dx;","\xA2","&dx;","\xF2","&Dy;","\xAF","&dy;","\xFF","&Zx;","\xB6","&zx;","\xD6", "&Sx;","\xC8","&sx;","\xE8","&Lx;","\xA9","&lx;","\xF9","&Nx;","\xAA","&nx;","\xFA", "A","\xB0","B","\xB1","V","\xB2","G","\xB3","D","\xB4","E","\xB5","Z","\xB7","I","\xB8", "J","\xA8","K","\xBA","L","\xBB","M","\xBC","N","\xBD","O","\xBE","P","\xBF","R","\xC0", "S","\xC1","T","\xC2","U","\xC3","F","\xC4","H","\xC5","C","\xC6", "a","\xD0","b","\xD1","v","\xD2","g","\xD3","d","\xD4","e","\xD5","z","\xD7","i","\xD8", "j","\xF8","k","\xDA","l","\xDB","m","\xDC","n","\xDD","o","\xDE","p","\xDF","r","\xE0", "s","\xE1","t","\xE2","u","\xE3","f","\xE4","h","\xE5","c","\xE6"}; char *trenStr, inTag=0; qsort(codes,0,CcodesNum-1); for (trenStr=Buffer_Read();*trenStr!=EOF;trenStr=Buffer_Read()) {char c=*trenStr; if (inTag) { putc(c,stdout); if (c=='>'|| c==']') inTag=0;} else if (c=='<'||c=='[') { putc(c,stdout); inTag=1;} else { /* sada ide binarna pretraga */ int i=0,j=CcodesNum-1; do {int k=(i+j)>>1; if (myStrCmp(trenStr,codes[k].srcStr)>0) i=k+1; else j=k; } while (i') inTag=0; else if (!myStriCmp(trenStr,chStr)) {trenPos+=sizeof(chStr)-2;printf("%s",chStr+1); skipMarkers(); trenStr=Buffer_Read(); putc(*trenStr,stdout); if (*trenStr=='=') {skipMarkers(); if (!myStriCmp(trenStr=Buffer_Read(),"iso-8859-1")) {printf("%s",destStr[option]);trenPos+=10-1;break;} else putc(*trenStr,stdout); } } } else if (!myStriCmp(trenStr,beginTagStr)) {printf("%s",beginTagStr+1); /* da li ulazimo u meta tag */ trenPos+=sizeof(beginTagStr)-2; inTag=1;} } if (*trenStr==EOF) return 0; /* neuspeh - oznaka kodne sheme nije nadjena */ else {do putc(*(trenStr=Buffer_Read()),stdout); while (*trenStr!='>'); /* dodji do kraja taga */ return 1;} } /**************************************************************************/ int toUpCase(int ch) { if (ch>=97 && ch<=122) return ch-32; else return ch;} /**************************************************************************/ int main(int argc, char *argv[]) {char cparam=toUpCase(*argv[1]); if (cparam=='L') if (shema(0)) iso8859_2(); else { printf(" \n Pogresan format!"); return 1;} else if (cparam=='C') if (shema(1)) iso8859_5(); else { printf("\n Pogresan format!"); return 1;} else { printf(" Greska u parametru! \n"); return 1;} return 0; /* USPEH */ }