From f13b0925fc982df256780392ed3de705aab60feb Mon Sep 17 00:00:00 2001 From: Edwin Groothuis Date: Tue, 7 Oct 2003 07:21:44 +0000 Subject: new port: russian/koi2koi Simple filter for autoconverting widely used cyrillic encodings to KOI8-R PR: ports/50725 Submitted by: Dmitry Morozovsky --- russian/koi2koi/src/koi2koi.c | 156 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 russian/koi2koi/src/koi2koi.c (limited to 'russian/koi2koi/src/koi2koi.c') diff --git a/russian/koi2koi/src/koi2koi.c b/russian/koi2koi/src/koi2koi.c new file mode 100644 index 000000000000..3e929bb67bc5 --- /dev/null +++ b/russian/koi2koi/src/koi2koi.c @@ -0,0 +1,156 @@ +#include +#include "algoreco.h" + + +#define from_encoding koi +#define to_encoding koi +#define message_encoding koi +#define max_buffer_size 512 + +unsigned char buffer[max_buffer_size],debugchar[2]; +unsigned int lastchar, newchar, j, n, code_num; +int i, statist[5]; + + +#define from_to_char(argf,argt,argd) \ + ( argd < 128 )? argd :\ + (( argf ==iso)&&( argt ==iso))? argd :\ + ( argf ==iso)? to_the [ argt ][ argd & 127 ] :\ + ( argt ==iso)? from_the [ argf ][ argd & 127 ] :\ + to_the [ argt ][(from_the [ argf ][ argd & 127]) & 127 ] + +#define from_char(argf,argd) ((argd<128)||(argf==iso))? argd :\ + from_the [argf][argd & 127] + +int biletter_index (int encoding, int last_char, int new_char) +{ + int new; + new=key_new[from_char(encoding,new_char)]; + new=(table[key_last[from_char(encoding,last_char)]][new>>2]>>((new & 3)<<1))&3; + if (new==3) new=-10; + return(new); +} + +int main() +{ + while (((newchar=getchar())!=EOF)&&( newchar<128)) + { + putchar(newchar); + lastchar=newchar; + } + n=0; + j=0; + /* Пропустив возможное латинское начало */ + while ((n[%d,%d]->[%d,%d]->%d>>%d(%d)}\n", + debugchar, i,debugchar+1, + lastchar,newchar, + from_char(from_encoding,lastchar), from_char(from_encoding,newchar), + key_last[from_char(from_encoding,lastchar)], + key_new[from_char(from_encoding,newchar)], + table[key_last[from_char(from_encoding,lastchar)]] + [key_new[from_char(from_encoding,newchar)]>>2], + (key_new[from_char(from_encoding,newchar)]&3)<<1, + from_encoding); +#endif + if (newchar>128) + { + j=(i==0)? j+2: + (i==1)? j++: + (i==2)? 0:5; + if (j>3) + { +#if defined debug + printf("Подозрительно похоже на бессмыслицу!\n"); +#endif + break; + } + } + lastchar=newchar; + newchar=getchar(); + } + /* Если нет особых оснований сомневаться в кои - заканчиваем; + * + */ + if ((n==max_buffer_size)||(newchar==EOF)) + { + for(i=0;i statist[code_num]) code_num=i; + } +#if defined debug + printf("Кодировка файла= %d.\n",code_num); +#endif + /* и завершить работу + */ + for(i=0;i