Еще одна :)) Вот понадобилось написать. Но я не жадный, берите кто хотите :))
/* (C) A. Baranov 08.04.2003
Translit convertor.
translit.cpp
You can change, use this code as you whant.
Open source ;)
ГОСТ 16876-71
*/
/*
а - a к - k х - kh
б - b л - l ц - c
в - v м - m ч - ch
г - g н - n ш - sh
д - d о - o щ - shh
е - e п - p ъ - "
ё - jo р - r ы - y
ж - zh с - s ь - '
з - z т - t э - eh
и - i у - u ю - ju
й - jj ф - f я - ja
*/
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
char russia[] = "абвгдеёжзийклмнопрстуфцчшщъыьэюя";
char Russia[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФЦЧШЩЪЫЬЭЮЯ";
string translit[] = { "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "jj", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "c", "ch", "sh", "shh", "\"", "y", "'", "eh", "ju", "ja" };
void R2T( char*, int );
void T2R( char*, int );
int main( int argc, char** argv )
{
printf( "Translit convertor. (C) A.Baranov\n" );
printf( "GOST 16876-71\n" );
printf( "CP-1251\n" );
if( argc != 3 )
{
printf( "trsl -r filename Russia 2 translit\ntrsl -t filename translit 2 Russia\n" );
return 1;
}
FILE* file = fopen( argv[2], "r" );
if( file == NULL )
{
printf( "Can't open file\n" );
return 1;
}
fseek( file, 0, SEEK_END );
int size = ftell( file );
fseek( file, 0, SEEK_SET );
char* buffer = new char[size * 3];
if( buffer == NULL )
{
printf( "Memory out\n" );
fclose( file );
return 1;
}
memset( buffer, 0, size * 3 );
int ss = fread( buffer, size, 1, file );
if( ss != size )
{
// printf( "File is too long. Working with part of file\n" );
}
if( !strcmp( argv[1], "-r" ) )
{
R2T( buffer, size );
}
else
{
T2R( buffer, size );
}
delete[] buffer;
fclose( file );
return 0;
}
int GetRInx( char c )
{
for( int i = 0; i < sizeof(russia); i++ )
{
if( c == russia[i] )
return i;
}
for( i = 0; i < sizeof(Russia); i++ )
{
if( c == Russia[i] )
return i;
}
return -1;
}
int GetTInx( char c )
{
for( int i = 0; i < 32; i++ )
{
if( c == translit[i].c_str()[0] )
return i;
}
return -1;
}
void R2T( char* buffer, int size )
{
string ret;
for( int i = 0; i < size; i++ )
{
int j = GetRInx( buffer[i] );
if( j == -1 )
ret += buffer[i];
else
ret += translit[j];
}
printf( ret.c_str() );
}
char low( char u )
{
char c;
if( u >= 0x41 && u <= 0x5A )
c = u + 0x20;
else
c = u;
return c;
}
void T2R( char* buffer, int size )
{
string ret;
for( int i = 0; i < size; i++ )
{
char c = low( buffer[i] );
if( c == 'j' )
{
int next1 = low( buffer[i+1] );
if( next1 == 'o' )
{
ret += 'ё';
i++;
continue;
}
else if( next1 == 'j' )
{
ret += 'й';
i++;
continue;
}
else if( next1 == 'u' )
{
ret += 'ю';
i++;
continue;
}
else if( next1 == 'a' )
{
ret += 'я';
i++;
continue;
}
else
{
ret += "?";
continue;
}
}
else if( c == 'z' )
{
int next1 = low( buffer[i+1] );
if( next1 == 'h' )
{
ret += 'ж';
i++;
continue;
}
else
{
ret += "з";
continue;
}
}
else if( c == 'k' )
{
int next1 = low( buffer[i+1] );
if( next1 == 'h' )
{
ret += 'х';
i++;
continue;
}
else
{
ret += "к";
continue;
}
}
else if( c == 'c' )
{
int next1 = low( buffer[i+1] );
if( next1 == 'h' )
{
ret += 'ч';
i++;
continue;
}
else
{
ret += "ц";
continue;
}
}
else if( c == 's' )
{
int next1 = low( buffer[i+1] );
int next2 = low( buffer[i+2] );
if( next1 == 'h' )
{
if( next2 == 'h' )
{
ret += 'щ';
i += 2;
continue;
}
else
{
ret += 'ш';
i++;
continue;
}
}
else
{
ret += "с";
continue;
}
}
else if( c == 'e' )
{
int next1 = low( buffer[i+1] );
if( next1 == 'h' )
{
ret += 'э';
i++;
continue;
}
else
{
ret += "е";
continue;
}
}
else
{
int y;
if( (y = GetTInx( c )) == -1 )
ret += c;
else
ret += russia[y];
}
}
printf( ret.c_str() );
}
---
|