Két PCHAR vagyis null-terminated karaktersorozat kisbetű/nagybetű azonosságú összehasonlítására Windows alatt az lstrcmpi utasítás helyett (ami Windows NT-k alatt a lokalizáció miatt a natív unicode-formátumára konvertálja belül a két forrás string-et az összehasonlításhoz minden hívás alkalmával, ehhez előtte végigmegy rajtuk a hosszuk meghatározásához, stb.) célszerűbb a következő:
1. valahol a program indításakor elhelyezni egy 256 elemű _uppercase karakterbömtöt, feltölteni a 256 karakterrel, majd rá kiadni a
CHARUPPERBUFF(@_uppercase,256) ;
utasítást,
2. a programban elhelyezni a következő függvényt:
{ EAX: src0 string address
EDX: src1 string address }
pushad
xor esi,esi
xor edi,edi
mov ebx,offset(_UPPERCASE)
add esi,eax
jz @finalize
add edi,edx
jz @finalize
@compare:
xor eax,eax
xor edx,edx
xor ecx,ecx
add al,[esi]
lea esi[esi+01h]
mov dl,[edi]
mov al,[ebx+eax]
jz @final
add cl,[ebx+edx]
lea edi,[edi+01h]
jz @finalize
cmp al,cl
jz @compare
@finalize:
cmp eax,edx
popad
setz al ; elhagyható ASM szinten
ret
- procedure STREQUAL(src1,src2: PCHAR): boolean; magas szinten
- csak a string egyenlőséget/nemegyenlőséget adja vissza BOOL formában, viszont a kisebb/nagyobb relációt is az EFLAGS-ben
- a NULL pointer mindig a legkisebb a relációban
- ha egyik bemenő paramétere NULL, a másik egy 00h byte-ra mutató érvényes pointer, akkor nem egyenlőek, a NULL kisebb
[ Szerkesztve ]