stdlib segment para public 'slcode' assume cs:stdlib ; extrn $uprtbl:byte ; ; stricmp- Compares two strings, ignoring differences in case. ; ; inputs: ; ; es:di- First string (The string to compare) ; dx:si- Second string (The string to compare against) ; ; e.g., ; "if (es:di < dx:si) then ..." ; ; returns: ; ; cx- index into strings where they differ (points at the zero byte ; if the two strings are equal). ; ; Condition codes set according to the string comparison. You should ; use the unsigned branches (ja, jb, je, etc.) after calling this ; routine. ; public sl_stricmp ; sl_stricmp proc far push es push ds push bx push ax push si push di xchg di, si mov ax, es mov ds, ax mov es, dx xor cx, cx ;Set initial index to zero. lea bx, $uprtbl ; ; In order to preserve the direction flag across this call, we have to ; test whether or not it is set here and execute two completely separate ; pieces of code (so we know which state to exit in. Unfortunately, we ; cannot use pushf to preserve this flag since we need to return status ; info in the other flags. ; pushf pop ax test ah, 4 ;Test direction bit. jnz DirIsSet sclp: lodsb xlat cs:$uprtbl mov ah, al mov al, es:[di] xlat cs:$uprtbl cmp ah, al jne scNE ;If strings are <>, quit. inc cx ;Increment index into strs. inc di ;Incrment str2 ptr. cmp al, 0 ;Check for end of strings. jne sclp pushf dec cx popf ; scNE: pop di pop si pop ax pop bx pop ds pop es ret ;Return with direction flag clear. ; ; DirIsSet: lodsb xlat cs:$uprtbl mov ah, al mov al, es:[di] xlat cs:$uprtbl cmp ah, al jne scNE2 ;If strings are <>, quit. inc cx inc di cmp al, 0 ;Check for end of strings. jne DirIsSet pushf dec cx popf ; scNE2: pop di pop si pop ax pop bx pop ds pop es std ;Return with direction flag set. ret sl_stricmp endp ; ; stdlib ends end