информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Утилита транслитерации 08.04.03 16:45  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Еще одна :)) Вот понадобилось написать. Но я не жадный, берите кто хотите :))

/* (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() );
}

---
[C++] Давайте еще и я добавлю 09.04.03 21:04  
Автор: Ktirf <Æ Rusakov> Статус: Elderman
<"чистая" ссылка>
Во-первых, согласен по всем пунктам с amirul'ом. Во-вторых, этот код не собирается на gcc 3.2 :-P Там всего одна досадная мелочь.
В функции GetRInx - нехорошо использовать индекс i, объявленный в заголовке цикла, в следующих циклах. Дело в том, что по новому стандарту объявленные таким образом индексы имеют область видимости, ограниченную циклом, в заголовке коего они объявлены... В общем, лучше всего просто не связываться с объявлением индексной переменной в заголовке цикла, если ты ее собираешься использовать не в одном цикле.
терпи ещё ;) 09.04.03 15:56  
Автор: ZloyShaman <ZloyShaman> Статус: Elderman
<"чистая" ссылка>
Есть вобще клёвая тулза Штирлиц. Она сильно превосходит твою утиль по функциональности :)
[C++] Мои замечания 09.04.03 15:54  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Во-первых сделал бы утилиту фильтром (с stdin на stdout), а инфу выдавал бы только если спросят (ключ -h или -v). Использовать фильтр для перегона файл->файл можно, а использовать утилиту файл->файл например в трубах уже нельзя.

Во-вторых, раз уж использовать STL, то перевод Rus->Translit я бы реализовал на map<char, sting> - и писать меньше и поиск по map-у эффективнее, чем прямой перебор.

А в T->R вместо if else if else, я бы сделал switch - он для того и придуман

Это конечно не так уж и важно, но раз уж выложил на публичный форум - терпи :-)))
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach