home *** CD-ROM | disk | FTP | other *** search
- stdlib segment para public 'slcode'
- assume cs:stdlib
- ;
- extrn $uprtbl:byte
- ;
- ; strcmpl- Compares the string pointed at by es:si to the string following
- ; the call instruction.
- ;
- ; inputs:
- ;
- ; es:si- First string (The string to compare)
- ; cs:rtn- Second string (The string to compare against)
- ;
- ; e.g.,
- ; "if (es:si < cs:rtn) then ..."
- ;
- ; returns:
- ;
- ; ax- 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_stricmpl
- ;
- sl_stricmpl proc far
- push bp
- mov bp, sp
- push es
- push ds
- push bx
- push cx
- push si
- push di
- mov ax, es
- mov ds, ax
- les di, 2[bp]
- 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
- ;
- ; Compute the length of the string following the CALL instruction:
- ;
- cld
- mov al, 0
- mov cx, 0ffffh
- repne scasb
- xchg di, 2[bp] ;Save as new return address.
- ;
- xor cx, cx ;Set char index to zero.
- 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: mov ax, cx
- pop di
- pop si
- pop cx
- pop bx
- pop ds
- pop es
- pop bp
- ret ;Return with direction flag clear.
- ;
- ;
- DirIsSet: cld
- mov al, 0
- mov cx, 0ffffh
- repne scasb
- xchg di, 2[bp] ;Save as new return address.
- ;
- xor cx, cx ;Set char index to zero.
- sclp2: 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 ;Increment index into strs.
- inc di ;Incrment str2 ptr.
- cmp al, 0 ;Check for end of strings.
- jne sclp2
- pushf
- dec cx
- popf
- ;
- scNE2: mov ax, cx
- pop di
- pop si
- pop cx
- pop bx
- pop ds
- pop es
- pop bp
- std
- ret ;Return with direction flag set.
- ;
- ;
- ;
- sl_stricmpl endp
- ;
- ;
- stdlib ends
- end
-