summaryrefslogtreecommitdiff
path: root/strings/strings.asm
diff options
context:
space:
mode:
Diffstat (limited to 'strings/strings.asm')
-rw-r--r--strings/strings.asm1060
1 files changed, 0 insertions, 1060 deletions
diff --git a/strings/strings.asm b/strings/strings.asm
deleted file mode 100644
index 2224025cc72..00000000000
--- a/strings/strings.asm
+++ /dev/null
@@ -1,1060 +0,0 @@
-; Copyright (C) 2000, 2003 MySQL AB
-;
-; This library is free software; you can redistribute it and/or
-; modify it under the terms of the GNU Library General Public
-; License as published by the Free Software Foundation; version 2
-; of the License.
-;
-; This library is distributed in the hope that it will be useful,
-; but WITHOUT ANY WARRANTY; without even the implied warranty of
-; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-; Library General Public License for more details.
-;
-; You should have received a copy of the GNU Library General Public
-; License along with this library; if not, write to the Free
-; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
-; MA 02111-1307, USA
-
-; Note that if you don't have a macro assembler (like MASM) to compile
-; this file, you can instead compile all *.c files in the string
-; directory.
-
- TITLE Stringfunctions that we use often at MSDOS / Intel 8086
-
-ifndef M_I386
- .8087
- DOSSEG
- .MODEL LARGE
- .CODE
-
- ;
- ; Some macros
- ;
-
-q_movs MACRO ; as rep movsb but quicker
- shr cx,1
- rep movsw ; Move 2 bytes at a time
- adc cx,cx
- rep movsb ; Move last byte if any
- ENDM
-
-q_stos MACRO ; as rep stosb but quicker
- mov ah,al ; For word store
- shr cx,1
- rep stosw ; Move 2 bytes at a time
- adc cx,cx
- rep stosb ; Move last byte if any
- ENDM
-
-ifndef ZTC ; If not using ZORTECH compiler
- ;
- ; Compare memory
- ; Args: s1,s2,length
- ;
-
- PUBLIC _bcmp
-_bcmp PROC
- mov bx,bp ; Save bp
- mov dx,di ; Save di
- mov bp,sp
- push ds
- push si
- les di,DWORD PTR [bp+8] ; s2
- lds si,DWORD PTR [bp+4] ; s1
- mov cx,WORD PTR [bp+12] ; Length of memory-area
- jcxz @F ; Length = 0, return same
-; cld ; Work uppward
- repe cmpsb ; Compare strings
- jz @F ; Match found
- inc cx ; return matchpoint +1
-@@: mov ax,cx ; Return 0 if match, else pos from end
- pop si
- pop ds
- mov di,dx
- mov bp,bx
- ret
-_bcmp ENDP
-
- ;
- ; Find a char in a string
- ; Arg: str,char
- ; Ret: pointer to found char or NullS
- ;
-
-ifdef better_stringfunctions ; Breaks window linkage (broken linking)
-
- PUBLIC _strchr
-_strchr PROC
- mov bx,bp ; Save bp and di
- mov dx,di
- mov bp,sp
- les di,DWORD PTR [bp+4] ; str
- mov ah,BYTE PTR [bp+8] ; search
- xor al,al ; for scasb to find end
-
-@@: cmp ah,es:[di]
- jz @F ; Found char
- scasb
- jnz @B ; Not end
- xor di,di ; Not found
- mov es,di
-@@: mov ax,di
- mov di,dx ; Restore
- mov dx,es ; Seg adr
- mov bp,bx ; Restore
- ret
-_strchr ENDP
-
- ;
- ; Find length of string
- ; arg: str
- ; ret: length
- ;
-
- PUBLIC _strlen
-_strlen PROC
- mov bx,sp
- mov dx,di
- les di,DWORD PTR ss:[bx+4] ; Str
- xor al,al ; Find end of string
- mov cx,-1
-; cld
- repne scasb ; Find strend or length
- inc cx ; Calc strlength
- not cx
- mov ax,cx
- mov di,dx ; Restore register
- ret
-_strlen ENDP
-
-endif
-
- ;
- ; Move a string
- ; arg: dst,src
- ; ret: end-null of to
- ;
-
- PUBLIC _strmov
-_strmov PROC
- mov bx,bp
- mov cx,si
- mov bp,sp
- push ds
- push di
- les di,DWORD PTR [bp+4] ; dst
- lds si,DWORD PTR [bp+8] ; src
-; cld
-@@: mov al,ds:[si]
- movsb ; move arg
- and al,al
- jnz @B ; Not last
- lea ax,WORD PTR [di-1] ; Set DX:AX to point at last null
- mov dx,es
- pop di
- pop ds
- mov si,cx
- mov bp,bx
- ret
-_strmov ENDP
-
- ;
- ; Fill a area of memory with a walue
- ; Args: to,length,fillchar
- ;
-
- PUBLIC _bfill
-_bfill PROC
- mov bx,sp ; Get args through BX
- mov al,BYTE PTR ss:[bx+10] ; Fill
-bfill_10:
- mov dx,di ; Save di
- les di,DWORD PTR ss:[bx+4] ; Memory pointer
- mov cx,WORD PTR ss:[bx+8] ; Length
-; cld
- q_stos
- mov di,dx
- ret
-_bfill ENDP
-
- ;
- ; Fill a area with null
- ; Args: to,length
-
- PUBLIC _bzero
-_bzero PROC
- mov bx,sp ; Get args through BX
- mov al,0 ; Fill with null
- jmp short bfill_10
-_bzero ENDP
-
-endif ; ZTC
-
- ;
- ; Move a memory area
- ; Args: to,from,length
- ;
-
- PUBLIC _bmove
-_bmove PROC
- mov bx,bp
- mov dx,di
- mov ax,si
- mov bp,sp
- push ds
- lds si,DWORD PTR [bp+8] ; from
- les di,DWORD PTR [bp+4] ; to
- mov cx,WORD PTR [bp+12] ; Length of memory-area
-; cld ; Work uppward
- rep movsb ; Not q_movs because overlap ?
- pop ds
- mov si,ax
- mov di,dx
- mov bp,bx
- ret
-_bmove ENDP
-
- ;
- ; Move a alligned, not overlapped, by (long) divided memory area
- ; Args: to,from,length
- ;
-
- PUBLIC _bmove_align
-_bmove_align PROC
- mov bx,bp
- mov dx,di
- mov ax,si
- mov bp,sp
- push ds
- lds si,DWORD PTR [bp+8] ; from
- les di,DWORD PTR [bp+4] ; to
- mov cx,WORD PTR [bp+12] ; Length of memory-area
-; cld ; Work uppward
- inc cx ; fix if not divisible with word
- shr cx,1
- rep movsw ; Move 2 bytes at a time
- pop ds
- mov si,ax
- mov di,dx
- mov bp,bx
- ret
-_bmove_align ENDP
-
- ;
- ; Move a string from higher to lower
- ; Arg from+1,to+1,length
- ;
-
- PUBLIC _bmove_upp
-_bmove_upp PROC
- mov bx,bp
- mov dx,di
- mov ax,si
- mov bp,sp
- push ds
- lds si,DWORD PTR [bp+8] ; from
- les di,DWORD PTR [bp+4] ; to
- mov cx,WORD PTR [bp+12] ; Length of memory-area
- dec di ; Don't move last arg
- dec si
- std ; Work downward
- rep movsb ; Not q_movs because overlap ?
- cld ; C compilator want cld
- pop ds
- mov si,ax
- mov di,dx
- mov bp,bx
- ret
-_bmove_upp ENDP
-
- ;
- ; Append fillchars to string
- ; Args: dest,len,fill
- ;
-
- PUBLIC _strappend
-_strappend PROC
- mov bx,bp
- mov dx,di
- mov bp,sp
- les di,DWORD PTR [bp+4] ; Memory pointer
- mov cx,WORD PTR [bp+8] ; Length
- sub al,al ; Find end of string
-; cld
- repne scasb
- jnz sa_99 ; String to long, shorten it
- mov al,BYTE PTR [bp+10] ; Fillchar
- dec di ; Point at end null
- inc cx ; rep made one dec for null-char
- q_stos ; Store al in string
-sa_99: mov BYTE PTR es:[di],0 ; End of string
- mov di,dx
- mov bp,bx
- ret
-_strappend ENDP
-
- ;
- ; Find if string contains any char in another string
- ; Arg: str,set
- ; Ret: Pointer to first found char in str
- ;
-
- PUBLIC _strcont
-_strcont PROC
- mov bx,bp ; Save bp and di in regs
- mov dx,di
- mov bp,sp
- push ds
- push si
- lds si,DWORD PTR [bp+4] ; str
- les di,DWORD PTR [bp+8] ; Set
- mov cx,di ; Save for loop
- xor ah,ah ; For endtest
- jmp sc_60
-
-sc_10: scasb
- jz sc_fo ; Found char
-sc_20: cmp ah,es:[di] ; Test if null
- jnz sc_10 ; Not end of set yet
- inc si ; Next char in str
- mov di,cx ; es:di = Set
-sc_60: mov al,ds:[si] ; Test if this char exist
- and al,al
- jnz sc_20 ; Not end of string
- sub si,si ; Return Null
- mov ds,si
-sc_fo: mov ax,si ; Char found here
- mov di,dx ; Restore
- mov dx,ds ; Seg of found char
- pop si
- pop ds
- mov bp,bx
- ret
-_strcont ENDP
-
- ;
- ; Found end of string
- ; Arg: str
- ; ret: Pointer to end null
- ;
-
- PUBLIC _strend
-_strend PROC
- mov bx,sp
- mov dx,di ; Save
- les di,DWORD PTR ss:[bx+4] ; str
- mov cx,-1
- sub al,al ; Find end of string
-; cld
- repne scasb
- lea ax,WORD PTR [di-1] ; Endpos i DX:AX
- mov di,dx ; Restore
- mov dx,es
- ret
-_strend ENDP
-
- ;
- ; Make a string with len fill-chars and endnull
- ; Args: dest,len,fill
- ; Ret: dest+len
- ;
-
- PUBLIC _strfill
-_strfill PROC
- mov bx,bp ; Save sp
- mov bp,sp
- push di
- les di,DWORD PTR [bp+4] ; Memory pointer
- mov cx,WORD PTR [bp+8] ; Length
- mov al,BYTE PTR [bp+10] ; Fill
-; cld
- q_stos
- mov BYTE PTR es:[di],0 ; End NULL
- mov ax,di ; End i DX:AX
- mov dx,es
- pop di
- mov bp,bx
- ret
-_strfill ENDP
-
- ;
- ; Find a char in or end of a string
- ; Arg: str,char
- ; Ret: pointer to found char or NullS
- ;
-
- PUBLIC _strcend
-_strcend PROC
- mov bx,bp ; Save bp and di
- mov dx,di
- mov bp,sp
- les di,DWORD PTR [bp+4] ; str
- mov ah,BYTE PTR [bp+8] ; search
- xor al,al ; for scasb to find end
-
-@@: cmp ah,es:[di]
- jz @F ; Found char
- scasb
- jnz @B ; Not end
- dec di ; Not found, point at end of string
-@@: mov ax,di
- mov di,dx ; Restore
- mov dx,es ; Seg adr
- mov bp,bx ; Restore
- ret
-_strcend ENDP
-
- ;
- ; Test if string has a given suffix
- ;
-
-PUBLIC _is_prefix
-_is_prefix PROC
- mov dx,di ; Save di
- mov bx,sp ; Arguments through bx
- push ds
- push si
- les di,DWORD PTR ss:[bx+8] ; s2
- lds si,DWORD PTR ss:[bx+4] ; s1
- mov ax,1 ; Ok and zero-test
-; cld ; Work uppward
-@@: cmp ah,es:[di]
- jz suf_ok ; End of string; found suffix
- cmpsb ; Compare strings
- jz @B ; Same, possible prefix
- xor ax,ax ; Not suffix
-suf_ok: pop si
- pop ds
- mov di,dx
- ret
-_is_prefix ENDP
-
- ;
- ; Find a substring in string
- ; Arg: str,search
- ;
-
- PUBLIC _strstr
-_strstr PROC
- mov bx,bp
- mov bp,sp
- push ds
- push di
- push si
- lds si,DWORD PTR [bp+4] ; str
- les di,DWORD PTR [bp+8] ; search
- mov cx,di
- inc cx ; CX = search+1
- mov ah,es:[di] ; AH = First char in search
- jmp sf_10
-
-sf_00: mov si,dx ; si = Current str-pos
-sf_10: mov al,ds:[si] ; Test if this char exist
- and al,al
- jz sf_90 ; End of string, didn't find search
- inc si
- cmp al,ah
- jnz sf_10 ; Didn't find first char, continue
- mov dx,si ; Save str-pos in DX
- mov di,cx
-sf_20: cmp BYTE PTR es:[di],0
- jz sf_fo ; Found substring
- cmpsb
- jz sf_20 ; Char ok
- jmp sf_00 ; Next str-pos
-
-sf_90: sub dx,dx ; Return Null
- mov ds,dx
- inc dx ; Because of following dec
-sf_fo: mov ax,dx ; Char found here
- dec ax ; Pointed one after
- mov dx,ds
- pop si
- pop di ; End
- pop ds
- mov bp,bx
- ret
-_strstr ENDP
-
- ;
- ; Find a substring in string, return index
- ; Arg: str,search
- ;
-
- PUBLIC _strinstr
-_strinstr PROC
- push bp
- mov bp,sp
- push di
- les di,DWORD PTR [bp+10] ; search
- push es
- push di
- les di,DWORD PTR [bp+6] ; str
- push es
- push di
- call _strstr
- mov cx,ax
- or cx,dx
- jz si_99
- sub ax,di ; Pos from start
- inc ax ; And first pos = 1
-si_99: add sp,8
- pop di
- pop bp
- ret
-_strinstr ENDP
-
- ;
- ; Make a string of len length from another string
- ; Arg: dst,src,length
- ; ret: end of dst
- ;
-
- PUBLIC _strmake
-_strmake PROC
- mov bx,bp
- mov bp,sp
- push ds
- push di
- push si
- les di,DWORD PTR [bp+4] ; dst
- lds si,DWORD PTR [bp+8] ; src
- mov cx,WORD PTR [bp+12] ; Length of memory-area
- xor al,al ; For test of end-null
- jcxz sm_90 ; Nothing to move, put zero at end.
-; cld ; Work uppward
-
-@@: cmp al,ds:[si] ; Next char to move
- movsb ; move arg
- jz sm_99 ; last char, we are ready
- loop @B ; Continue moving
-sm_90: mov BYTE PTR es:[di],al ; Set end pos
- inc di ; Fix that di points at end null
-sm_99: dec di ; di points now at end null
- mov ax,di ; Ret value in DX:AX
- mov dx,es
- pop si
- pop di
- pop ds
- mov bp,bx
- ret
-_strmake ENDP
-
- ;
- ; Find length of string with maxlength
- ; arg: str,maxlength
- ; ret: length
- ;
-
- PUBLIC _strnlen
-_strnlen PROC
- mov bx,bp
- mov bp,sp
- push di
- les di,DWORD PTR [bp+4] ; Str
- mov cx,WORD PTR [bp+8] ; length
- mov dx,di ; Save str to calc length
- jcxz sn_10 ; Length = 0
- xor al,al ; Find end of string
-; cld
- repne scasb ; Find strend or length
- jnz sn_10
- dec di ; DI points at last null
-sn_10: mov ax,di
- sub ax,dx ; Ax = length
- pop di
- mov bp,bx
- ret
-_strnlen ENDP
-
- ;
- ; Move a string with max len chars
- ; arg: dst,src,len
- ; ret: pos to first null or dst+len
-
- PUBLIC _strnmov
-_strnmov PROC
- mov bx,bp
- mov bp,sp
- push ds
- push di
- push si
- les di,DWORD PTR [bp+4] ; dst
- lds si,DWORD PTR [bp+8] ; src
- mov cx,WORD PTR [bp+12] ; length
- jcxz snm_99 ; Nothing to do
- xor al,al ; For test of end-null
-; cld
-
-@@: cmp al,ds:[si] ; Next char to move
- movsb ; move arg
- jz snm_20 ; last char, fill with null
- loop @B ; Continue moving
- inc di ; Point two after last
-snm_20: dec di ; Point at first null (or last+1)
-snm_99: mov ax,di ; Pointer at last char
- mov dx,es ; To-segment
- pop si
- pop di
- pop ds
- mov bp,bx ; Restore
- ret
-_strnmov ENDP
-
-else ; M_I386
-
-include macros.asm
-
-q_stos MACRO ; as rep stosb but quicker, Uses edx
- mov ah,al ;(2) Set up a 32 bit pattern.
- mov edx,eax ;(2)
- shl edx,16 ;(3)
- or eax,edx ;(2) EAX has the 32 bit pattern.
-
- mov edx,ecx ;(2) Save the count of bytes.
- shr ecx,2 ;(2) Number of dwords.
- rep stosd ;(5 + 5n)
- mov cl,3 ;(2)
- and ecx,edx ;(2) Fill in the remaining odd bytes.
- rep stosb ; Move last bytes if any
- ENDM
-
-fix_es MACRO fix_cld ; Load ES if neaded
- ife ESeqDS
- mov ax,ds
- mov es,ax
- endif
- ifnb <fix_cld>
- cld
- endif
- ENDM
-
- ;
- ; Move a memory area
- ; Args: to,from,length
- ; Acts as one byte was moved a-time from dst to source.
- ;
-
- begcode bmove
- public _bmove
-_bmove proc near
- fix_es 1
- mov edx,edi
- mov eax,esi
- mov edi,P-SIZEPTR[esp] ;p1
- mov esi,P[esp] ;p2
- mov ecx,P+SIZEPTR[esp]
- rep movsb ; Not q_movs because overlap ?
- mov esi,eax
- mov edi,edx
- ret
-_bmove ENDP
- endcode bmove
-
- ;
- ; Move a alligned, not overlapped, by (long) divided memory area
- ; Args: to,from,length
- ;
-
- begcode bmove_align
- public _bmove_align
-_bmove_align proc near
- fix_es 1
- mov edx,edi
- mov eax,esi
- mov edi,P-SIZEPTR[esp] ;to
- mov esi,P[esp] ;from
- mov ecx,P+SIZEPTR[esp] ;length
- add cx,3 ;fix if not divisible with long
- shr cx,2
- rep movsd
- mov esi,eax
- mov edi,edx
- ret
-_bmove_align ENDP
- endcode bmove_align
-
- ;
- ; Move a string from higher to lower
- ; Arg from+1,to+1,length
- ;
-
- begcode bmove_upp
- public _bmove_upp
-_bmove_upp proc near
- fix_es
- std ; Work downward
- mov edx,edi
- mov eax,esi
- mov edi,P-SIZEPTR[esp] ;p1
- mov esi,P[esp] ;p2
- mov ecx,P+SIZEPTR[esp]
- dec edi ; Don't move last arg
- dec esi
- rep movsb ; One byte a time because overlap !
- cld ; C compilator wants cld
- mov esi,eax
- mov edi,edx
- ret
-_bmove_upp ENDP
- endcode bmove_upp
-
- ;
- ; Append fillchars to string
- ; Args: dest,len,fill
- ;
-
- begcode strappend
- public _strappend
-_strappend proc near
- push ebp
- mov ebp,esp
- fix_es 1
- push edi
- mov edi,P[ebp] ; Memory pointer
- mov ecx,P+SIZEPTR[ebp] ; Length
- clr eax ; Find end of string
- repne scasb
- jnz sa_99 ; String to long, shorten it
- movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fillchar
- dec edi ; Point at end null
- inc ecx ; rep made one dec for null-char
- q_stos ; Store al in string
-sa_99: mov BYTE PTR [edi],0 ; End of string
- pop edi
- pop ebp
- ret
-_strappend ENDP
- endcode strappend
-
- ;
- ; Find if string contains any char in another string
- ; Arg: str,set
- ; Ret: Pointer to first found char in str
- ;
-
- begcode strcont
- PUBLIC _strcont
-_strcont proc near
- push ebp
- mov ebp,esp
- fix_es 1
- mov edx,edi
- push esi
- mov esi,P[ebp] ; str
- mov ecx,P+SIZEPTR[ebp] ; Set
- clr ah ; For endtest
- jmps sc_60
-
-sc_10: scasb
- jz sc_fo ; Found char
-sc_20: cmp ah,[edi] ; Test if null
- jnz sc_10 ; Not end of set yet
- inc esi ; Next char in str
-sc_60: mov edi,ecx ; edi = Set
- mov al,[esi] ; Test if this char exist
- and al,al
- jnz sc_20 ; Not end of string
- clr esi ; Return Null
-sc_fo: mov eax,esi ; Char found here
- mov edi,edx ; Restore
- pop esi
- pop ebp
- ret
-_strcont ENDP
- endcode strcont
-
- ;
- ; Found end of string
- ; Arg: str
- ; ret: Pointer to end null
- ;
-
- begcode strend
- public _strend
-_strend proc near
- fix_es 1
- mov edx,edi ; Save
- mov edi,P-SIZEPTR[esp] ; str
- clr eax ; Find end of string
- mov ecx,eax
- dec ecx ; ECX = -1
- repne scasb
- mov eax,edi
- dec eax
- mov edi,edx ; Restore
- ret
-_strend endp
- endcode strend
-
- ;
- ; Make a string with len fill-chars and endnull
- ; Args: dest,len,fill
- ; Ret: dest+len
- ;
-
- begcode strfill
- public _strfill
-_strfill proc near
- push ebp
- mov ebp,esp
- fix_es 1
- push edi
- mov edi,P[ebp] ; Memory pointer
- mov ecx,P+SIZEPTR[ebp] ; Length
- movzx eax,byte ptr P+(2*SIZEPTR)[ebp] ; Fill
- q_stos
- mov BYTE PTR [edi],0 ; End NULL
- mov eax,edi ; End i DX:AX
- pop edi
- pop ebp
- ret
-_strfill endp
- endcode strfill
-
- ;
- ; Find a char in or end of a string
- ; Arg: str,char
- ; Ret: pointer to found char or NullS
- ;
-
- begcode strcend
- public _strcend
-_strcend proc near
- push ebp
- mov ebp,esp
- fix_es 1
- mov edx,edi
- mov edi,P[ebp] ; str
- mov ah,P+SIZEPTR[ebp] ; search
- clr al ; for scasb to find end
-
-@@: cmp ah,[edi]
- jz @F ; Found char
- scasb
- jnz @B ; Not end
- dec edi ; Not found, point at end of string
-@@: mov eax,edi
- mov edi,edx ; Restore
- pop ebp
- ret
-_strcend ENDP
- endcode strcend
-
- ;
- ; Test if string has a given suffix
- ;
-
- begcode is_prefix
- public _is_prefix
-_is_prefix proc near
- fix_es 1
- mov edx,edi ; Save edi
- mov eax,esi ; Save esi
- mov esi,P[esp] ; get suffix
- mov edi,P-SIZEPTR[esp] ; s1
- push eax ; push esi
- mov eax,1 ; Ok and zero-test
-@@: cmp ah,[esi]
- jz suf_ok ; End of string; found suffix
- cmpsb ; Compare strings
- jz @B ; Same, possible prefix
- xor eax,eax ; Not suffix
-suf_ok: pop esi
- mov edi,edx
- ret
-_is_prefix endp
- endcode _is_prefix
-
- ;
- ; Find a substring in string
- ; Arg: str,search
- ;
-
- begcode strstr
- public _strstr
-_strstr proc near
- push ebp
- mov ebp,esp
- fix_es 1
- push EDI
- push ESI
- mov esi,P[ebp] ; str
- mov edi,P+SIZEPTR[ebp] ; search
- mov ecx,edi
- inc ecx ; ECX = search+1
- mov ah,[edi] ; AH = First char in search
- jmps sf_10
-
-sf_00: mov esi,edx ; si = Current str-pos
-sf_10: mov al,[esi] ; Test if this char exist
- and al,al
- jz sf_90 ; End of string, didn't find search
- inc esi
- cmp al,ah
- jnz sf_10 ; Didn't find first char, continue
- mov edx,esi ; Save str-pos in EDX
- mov edi,ecx
-sf_20: cmp BYTE PTR [edi],0
- jz sf_fo ; Found substring
- cmpsb
- jz sf_20 ; Char ok
- jmps sf_00 ; Next str-pos
-
-sf_90: mov edx,1 ; Return Null
-sf_fo: mov eax,edx ; Char found here
- dec eax ; Pointed one after
- pop ESI
- pop EDI
- pop ebp
- ret
-_strstr endp
- endcode strstr
-
- ;
- ; Find a substring in string, return index
- ; Arg: str,search
- ;
-
- begcode strinstr
- public _strinstr
-_strinstr proc near
- push ebp
- mov ebp,esp
- push P+SIZEPTR[ebp] ; search
- push P[ebp] ; str
- call _strstr
- add esp,SIZEPTR*2
- or eax,eax
- jz si_99 ; Not found, return NULL
- sub eax,P[ebp] ; Pos from start
- inc eax ; And first pos = 1
-si_99: pop ebp
- ret
-_strinstr endp
- endcode strinstr
-
- ;
- ; Make a string of len length from another string
- ; Arg: dst,src,length
- ; ret: end of dst
- ;
-
- begcode strmake
- public _strmake
-_strmake proc near
- push ebp
- mov ebp,esp
- fix_es 1
- push EDI
- push ESI
- mov edi,P[ebp] ; dst
- mov esi,P+SIZEPTR[ebp] ; src
- mov ecx,P+SIZEPTR*2[ebp] ; Length of memory-area
- clr al ; For test of end-null
- jcxz sm_90 ; Nothing to move, put zero at end.
-
-@@: cmp al,[esi] ; Next char to move
- movsb ; move arg
- jz sm_99 ; last char, we are ready
- loop @B ; Continue moving
-sm_90: mov BYTE PTR [edi],al ; Set end pos
- inc edi ; Fix that di points at end null
-sm_99: dec edi ; di points now at end null
- mov eax,edi ; Ret value in DX:AX
- pop ESI
- pop EDI
- pop ebp
- ret
-_strmake ENDP
- endcode strmake
-
- ;
- ; Find length of string with maxlength
- ; arg: str,maxlength
- ; ret: length
- ;
-
- begcode strnlen
- public _strnlen
-_strnlen proc near
- push ebp
- mov ebp,esp
- fix_es 1
- push edi
- mov edi,P[ebp] ; Str
- mov ecx,P+SIZEPTR[ebp] ; length
- mov edx,edi ; Save str to calc length
- jcxz sn_10 ; Length = 0
- clr al ; Find end of string
- repne scasb ; Find strend or length
- jnz sn_10
- dec edi ; DI points at last null
-sn_10: mov eax,edi
- sub eax,edx ; Ax = length
- pop edi
- pop ebp
- ret
-_strnlen ENDP
- endcode strnlen
-
- ;
- ; Move a string with max len chars
- ; arg: dst,src,len
- ; ret: pos to first null or dst+len
-
- begcode strnmov
- public _strnmov
-_strnmov PROC near
- push ebp
- mov ebp,esp
- fix_es 1
- push EDI
- push ESI
- mov edi,P[ebp] ; dst
- mov esi,P+SIZEPTR[ebp] ; src
- mov ecx,P+(SIZEPTR*2)[ebp] ; length
- jcxz snm_99 ; Nothing to do
- clr al ; For test of end-null
-
-@@: cmp al,[esi] ; Next char to move
- movsb ; move arg
- jz snm_20 ; last char, fill with null
- loop @B ; Continue moving
- inc edi ; Point two after last
-snm_20: dec edi ; Point at first null (or last+1)
-snm_99: mov eax,edi ; Pointer at last char
- pop ESI
- pop EDI
- pop ebp
- ret
-_strnmov ENDP
- endcode strnmov
-
-;
-; Zortech has this one in standard library
-;
-
- begcode strmov
- public _strmov
-_strmov proc near
- mov ecx,esi ; Save old esi and edi
- mov edx,edi
- mov esi,P[esp] ; get source pointer (s2)
- mov edi,P-SIZEPTR[esp] ; EDI -> s1
- fix_es 1
-@@: mov al,[esi]
- movsb ; move arg
- and al,al
- jnz @B ; Not last
- mov eax,edi
- dec eax
- mov esi,ecx ; Restore args
- mov edi,edx
- ret
-_strmov endp
- endcode strmov
-
-endif ; M_I386
-
- END