Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Clint

Tirar acentos a uma string

Mensagens Recomendadas

Clint

Olá! Já à muito tempo (quase um ano) que eu não vinha aqui ao Fórum.

A minha dúvida é a seguinte:

Fiz duas funções, a primeira em Assembly Inline e a segunda em C++ convencional. O que as duas fazem é tirar os acentos a uma string, por exemplo:

Converter esta string: "Mário João Águeda" nesta: "Mario Joao Agueda".

void TiraAcentos(char* s)
{
__asm 
{
		mov ebx, s
		dec ebx

	Repeat:	add ebx, 1
		mov eax, [ebx]
		and eax, 0xff // 255
		cmp eax, 0x0 // '/0'
		je  Fim

		cmp eax, 0xc0 // 'À'
		jb  Repeat
		cmp eax, 0xe0 // 'à'
		jae LowerCase
		cmp eax, 0xc4 // 'Ä'
		jbe A
		cmp eax, 0xc7 // 'Ç'
		je C
		cmp eax, 0xcb // 'Ë'
		jbe E
		cmp eax, 0xcf // 'Ï'
		jbe I
		cmp eax, 0xd1 // 'Ñ'
		je N
		cmp eax, 0xd6 // 'Ö'
		jbe O
		cmp eax, 0xdc // 'Ü'
		jbe U

		mov BYTE PTR [ebx], 'Y'
		jmp Repeat

	A:	mov BYTE PTR [ebx], 'A'
		jmp Repeat
	C:	mov BYTE PTR [ebx], 'C'
		jmp Repeat
	E:	mov BYTE PTR [ebx], 'E'
		jmp Repeat
	I:	mov BYTE PTR [ebx], 'I'
		jmp Repeat
	N:	mov BYTE PTR [ebx], 'N'
		jmp Repeat
	O:	mov BYTE PTR [ebx], 'O'
		jmp Repeat
	U:	mov BYTE PTR [ebx], 'U'
		jmp Repeat

	LowerCase: cmp eax, 0xe4 // 'ä'
		jbe a_
		cmp eax, 0xe7 // 'ç'
		je c_
		cmp eax, 0xeb // 'ë'
		jbe e_
		cmp eax, 0xef // 'ï'
		jbe i_
		cmp eax, 0xf1 // 'ñ'
		je n_
		cmp eax, 0xf6 // 'ö'
		jbe o_
		cmp eax, 0xfc // 'ü'
		jbe u_

		mov BYTE PTR [ebx], 'y'
		jmp Repeat

	a_:	mov BYTE PTR [ebx], 'a'
		jmp Repeat
	c_:	mov BYTE PTR [ebx], 'c'
		jmp Repeat
	e_:	mov BYTE PTR [ebx], 'e'
		jmp Repeat
	i_:	mov BYTE PTR [ebx], 'i'
		jmp Repeat
	n_:	mov BYTE PTR [ebx], 'n'
		jmp Repeat
	o_:	mov BYTE PTR [ebx], 'o'
		jmp Repeat
	u_:	mov BYTE PTR [ebx], 'u'
		jmp Repeat

	Fim:
}
}

void TiraAcentos(char* s, int len)
{
for (int i = 0; i < len; i++)
	if (s[i] < 0)
		if (s[i] >= 'À' && s[i] <= 'Ý')
		{
			if (s[i] <= 'Ï')
			{
				if (s[i] <= 'Ç')
				{
					if (s[i] <= 'Ä')
						s[i] = 'A';
					else 
						s[i] = 'C';
				}
				else if (s[i] <= 'Ë')
					s[i] = 'E';
				else
					s[i] = 'I';
			}
			else if (s[i] <= 'Ö')
				{
					if (s[i] == 'Ñ')
						s[i] = 'N';
					else
						s[i] = 'O';
				}
				else if (s[i] <= 'Ü')
					s[i] = 'U';
				else 
					s[i] = 'Y';
		}
		else if (s[i] >= 'à')
		{
			if (s[i] <= 'ï')
			{
				if (s[i] <= 'ç')
				{
					if (s[i] <= 'ä')
						s[i] = 'a';
					else
						s[i] = 'c';
				}
				else if (s[i] <= 'ë')
					s[i] = 'e';
				else
					s[i] = 'i';
			}
			else if (s[i] <= 'ö')
				{
					if (s[i] == 'ñ')
						s[i] = 'n'; 
					else 
						s[i] = 'o';
				}
				else if (s[i] <= 'ü')
					s[i] = 'u';
				else 
					s[i] = 'y';
		}
}

Será que a função em Assembly está suficientemente bem optimizada para superar em desempenho a função em C++?

Gostava que me esclarecessem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.