#include #include #include #include "hdr.h" #include "conv.h" typedef struct Tmap Tmap; struct Tmap { Rune u; Rune t; }; static Tmap t1[] = { {0x0b85/*א®…*/, 0xe201/*מˆ�*/}, {0x0b86/*א®†*/, 0xe202/*מˆ‚*/}, {0x0b87/*א®‡*/, 0xe203/*מˆƒ*/}, {0x0b88/*א®ˆ*/, 0xe204/*מˆ„*/}, {0x0b89/*א®‰*/, 0xe205/*מˆ…*/}, {0x0b8a/*א®�*/, 0xe206/*מˆ†*/}, {0x0b8e/*א®�*/, 0xe207/*מˆ‡*/}, {0x0b8f/*א®�*/, 0xe208/*מˆˆ*/}, {0x0b90/*א®�*/, 0xe209/*מˆ‰*/}, {0x0b92/*א®’*/, 0xe20a/*מˆ�*/}, {0x0b93/*א®“*/, 0xe20b/*מˆ‹*/}, {0x0b94/*א®”*/, 0xe20c/*מˆ�*/}, {0x0b83/*א®ƒ*/, 0xe20d/*מˆ�*/} }; static Rune t2[] = { 0x0bcd/*א¯�*/, 0x0bcd/*א¯�*/, // filler 0x0bbe/*א®¾*/, 0x0bbf/*א®¿*/, 0x0bc0/*א¯€*/, 0x0bc1/*א¯�*/, 0x0bc2/*א¯‚*/, 0x0bc6/*א¯†*/, 0x0bc7/*א¯‡*/, 0x0bc8/*א¯ˆ*/, 0x0bca/*א¯�*/, 0x0bcb/*א¯‹*/, 0x0bcc/*א¯�*/ }; static Tmap t3[] = { {0x0b95/*א®•*/, 0xe211/*מˆ‘*/}, {0x0b99/*א®™*/, 0xe221/*מˆ¡*/}, {0x0b9a/*א®�*/, 0xe231/*מˆ±*/}, {0x0b9c/*א®�*/, 0xe331/*מ�±*/}, {0x0b9e/*א®�*/, 0xe241/*מ‰�*/}, {0x0b9f/*א®�*/, 0xe251/*מ‰‘*/}, {0x0ba3/*א®£*/, 0xe261/*מ‰¡*/}, {0x0ba4/*א®₪*/, 0xe271/*מ‰±*/}, {0x0ba8/*א®¨*/, 0xe281/*מ��*/}, {0x0ba9/*א®©*/, 0xe321/*מ�¡*/}, {0x0baa/*א®×*/, 0xe291/*מ�‘*/}, {0x0bae/*א®®*/, 0xe2a1/*מ�¡*/}, {0x0baf/*א®¯*/, 0xe2b1/*מ�±*/}, {0x0bb0/*א®°*/, 0xe2c1/*מ‹�*/}, {0x0bb1/*א®±*/, 0xe311/*מ�‘*/}, {0x0bb2/*א®²*/, 0xe2d1/*מ‹‘*/}, {0x0bb3/*א®³*/, 0xe301/*מ��*/}, {0x0bb4/*א®´*/, 0xe2f1/*מ‹±*/}, {0x0bb5/*א®µ*/, 0xe2e1/*מ‹¡*/}, {0x0bb6/*א®¶*/, 0xe341/*מ��*/}, {0x0bb7/*א®·*/, 0xe351/*מ�‘*/}, {0x0bb8/*א®¸*/, 0xe361/*מ�¡*/}, {0x0bb9/*א®¹*/, 0xe371/*מ�±*/} }; static Rune findbytune(Tmap *tab, int size, Rune t) { int i; for(i = 0; i < size; i++) if(tab[i].t == t) return tab[i].u; return Runeerror; } static Rune findbyuni(Tmap *tab, int size, Rune u) { int i; for(i = 0; i < size; i++) if(tab[i].u == u) return tab[i].t; return Runeerror; } static int findindex(Rune *rstr, int size, Rune r) { int i; for(i = 0; i < size; i++) if(rstr[i] == r) return i; return -1; } void tune_in(int fd, long *x, struct convert *out) { Biobuf b; Rune rbuf[N]; Rune *r, *er, tr; int c, i; USED(x); r = rbuf; er = rbuf+N-3; Binit(&b, fd, OREAD); while((c = Bgetrune(&b)) != Beof){ ninput += b.runesize; if(r >= er){ OUT(out, rbuf, r-rbuf); r = rbuf; } if(c>=0xe210/*מˆ�*/ && c <= 0xe38c/*מ��*/ && (i = c%16) < nelem(t2)){ if(c >= 0xe380/*מ�€*/){ *r++ = 0x0b95/*א®•*/; *r++ = 0x0bcd/*א¯�*/; *r++ = 0x0bb7/*א®·*/; }else *r++ = findbytune(t3, nelem(t3), c-i+1); if(i != 1) *r++ = t2[i]; }else if((tr = findbytune(t1, nelem(t1), c)) != Runeerror) *r++ = tr; else switch(c){ case 0xe3d0/*מ��*/: *r++ = 0x0ba3/*א®£*/; *r++ = 0x0bbe/*א®¾*/; break; case 0xe3d1/*מ�‘*/: *r++ = 0x0bb1/*א®±*/; *r++ = 0x0bbe/*א®¾*/; break; case 0xe3d2/*מ�’*/: *r++ = 0x0ba9/*א®©*/; *r++ = 0x0bbe/*א®¾*/; break; case 0xe3d4/*מ�”*/: *r++ = 0x0ba3/*א®£*/; *r++ = 0x0bc8/*א¯ˆ*/; break; case 0xe3d5/*מ�•*/: *r++ = 0x0bb2/*א®²*/; *r++ = 0x0bc8/*א¯ˆ*/; break; case 0xe3d6/*מ�–*/: *r++ = 0x0bb3/*א®³*/; *r++ = 0x0bc8/*א¯ˆ*/; break; case 0xe3d7/*מ�—*/: *r++ = 0x0ba9/*א®©*/; *r++ = 0x0bc8/*א¯ˆ*/; break; case 0xe38d/*מ��*/: *r++ = 0x0bb6/*א®¶*/; *r++ = 0x0bcd/*א¯�*/; *r++ = 0x0bb0/*א®°*/; *r++ = 0x0bc0/*א¯€*/; break; default: if(c >= 0xe200 && c <= 0xe3ff){ if(squawk) EPR "%s: rune 0x%x not in output cs\n", argv0, c); nerrors++; if(clean) break; c = BADMAP; } *r++ = c; break; } } if(r > rbuf) OUT(out, rbuf, r-rbuf); OUT(out, rbuf, 0); } void tune_out(Rune *r, int n, long *x) { static int state = 0; static Rune lastr; Rune *er, tr, rr; char *p; int i; USED(x); nrunes += n; er = r+n; for(p = obuf; r < er; r++){ switch(state){ case 0: case0: if((tr = findbyuni(t3, nelem(t3), *r)) != Runeerror){ lastr = tr; state = 1; }else if(*r == 0x0b92/*א®’*/){ lastr = 0xe20a/*מˆ�*/; state = 3; }else if((tr = findbyuni(t1, nelem(t1), *r)) != Runeerror) p += runetochar(p, &tr); else p += runetochar(p, r); break; case 1: case1: if((i = findindex(t2, nelem(t2), *r)) != -1){ if(lastr && lastr != Runeerror) lastr += i-1; if(*r ==0x0bc6/*א¯†*/) state = 5; else if(*r ==0x0bc7/*א¯‡*/) state = 4; else if(lastr == 0xe210/*מˆ�*/) state = 2; else if(lastr == 0xe340/*מ�€*/) state = 6; else{ if(lastr) p += runetochar(p, &lastr); state = 0; } }else if(lastr && lastr != Runeerror && (*r == 0x00b2/*ֲ²*/ || *r == 0x00b3/*ֲ³*/ || *r == 0x2074/*ג�´*/)){ if(squawk) EPR "%s: character not in output cs\n", argv0, lastr, *r); lastr = clean ? 0 : Runeerror; nerrors++; }else{ if(lastr) p += runetochar(p, &lastr); state = 0; goto case0; } break; case 2: if(*r == 0x0bb7/*א®·*/){ lastr = 0xe381/*מ��*/; state = 1; break; } p += runetochar(p, &lastr); state = 0; goto case0; case 3: state = 0; if(*r == 0x0bd7/*א¯—*/){ rr = 0xe20c/*מˆ�*/; p += runetochar(p, &rr); break; } p += runetochar(p, &lastr); goto case0; case 4: state = 0; if(*r == 0x0bbe/*א®¾*/){ if(lastr){ if(lastr != Runeerror) lastr += 3; p += runetochar(p, &lastr); } break; } if(lastr) p += runetochar(p, &lastr); goto case0; case 5: state = 0; if(*r == 0x0bbe/*א®¾*/ || *r == 0x0bd7/*א¯—*/){ if(lastr){ if(lastr != Runeerror) lastr += *r == 0x0bbe/*א®¾*/ ? 3 : 5; p += runetochar(p, &lastr); } break; } if(lastr) p += runetochar(p, &lastr); goto case0; case 6: if(*r == 0x0bb0/*א®°*/){ state = 7; break; } p += runetochar(p, &lastr); state = 0; goto case0; case 7: if(*r == 0x0bc0/*א¯€*/){ rr = 0xe38d/*מ��*/; p += runetochar(p, &rr); state = 0; break; } p += runetochar(p, &lastr); lastr = 0xe2c1/*מ‹�*/; state = 1; goto case1; } } if(n == 0 && state != 0){ if(lastr) p += runetochar(p, &lastr); state = 0; } noutput += p-obuf; write(1, obuf, p-obuf); }