La siguiente rutina compara dos cadenas teniendo en cuenta mayúsculas, minúsculas, acentos y los caracteres nacionales, incluidos los caracteres dobles 'CH' y 'LL'.

La utilidad de la rutina esta en ordenaciones, búsquedas, etcétera.

Esta preparada para los modelos LARGE y HUGE, pudiendo utilizarla desde el resto de modelos declarándolas como FAR (tanto en código como en datos).

Puede utilizarse directamente desde el lenguaje ensamblador (no modifica ningún registro), o indirectamente desde cualquier lenguaje que soporte las convenciones de llamada del C.

Los argumentos y sus observaciones son los siguientes:

-Cadena1 y Cadena2: Cadenas a comparar.

-Longitud: Longitud a comparar. Cuando las cadenas son de diferente longitud, debería ser la longitud de la cadena menor.

(Ver _STR_CMP_ASCIIZ.)

Como salida, la función devuelve los indicadores en ensamblador, o 1, 0 y -1 en C. Observar que cuando se comparan cadenas de diferente longitud, 0 (ZF) indica que la cadena de longitud menor es menor (salvo si se ha definido _STR_CMP_ASCIIZ).

Puede optimizarse utilizando una sola tabla para la obtención del carácter en mayúsculas y sin acento, aunque con el método actual pueden utilizarse las funciones ucase y quitar_acento de forma independiente.

Cuando no se requiere diferenciar los caracteres dobles CH y LL, puede también optimizarse comparando primero por bloques y luego individualmente solo en los caracteres diferentes: Esta es la optimización mas efectiva cuando se comparan cadenas similares.

STR_CMP_ASCIIZ.

Definiendo esta igualdad en el coligo fuente la rutina compara cadenas ASCIIZ, con lo que ya no se requiere el argumento Longitud (CX). La declaración de la función será en este caso:

int far str_cmp (char far *cadena1,char far *cadena2);

Para cualquier consulta llamar al (93) 347-54-14.

Juanjo Pérez Borrat.

(Barcelona)