mirror of
				https://github.com/notepad-plus-plus/notepad-plus-plus.git
				synced 2025-11-04 05:23:56 +01:00 
			
		
		
		
	go to notepad-plus-plus\PowerEditor\Test\FunctionList directory then launch the following commands: powershell ./unitTestLauncher.ps1
		
			
				
	
	
		
			232 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
        page    ,132
 | 
						|
        title   strcat - concatenate (append) one string to another
 | 
						|
;***
 | 
						|
;strcat.asm - contains strcat() and strcpy() routines
 | 
						|
;
 | 
						|
;       Copyright (c) Microsoft Corporation. All rights reserved.
 | 
						|
;
 | 
						|
;Purpose:
 | 
						|
;       STRCAT concatenates (appends) a copy of the source string to the
 | 
						|
;       end of the destination string, returning the destination string.
 | 
						|
;
 | 
						|
;*******************************************************************************
 | 
						|
 | 
						|
        .xlist
 | 
						|
        include cruntime.inc
 | 
						|
        .list
 | 
						|
 | 
						|
 | 
						|
page
 | 
						|
;***
 | 
						|
;char *strcat(dst, src) - concatenate (append) one string to another
 | 
						|
;
 | 
						|
;Purpose:
 | 
						|
;       Concatenates src onto the end of dest.  Assumes enough
 | 
						|
;       space in dest.
 | 
						|
;
 | 
						|
;       Algorithm:
 | 
						|
;       char * strcat (char * dst, char * src)
 | 
						|
;       {
 | 
						|
;           char * cp = dst;
 | 
						|
;
 | 
						|
;           while( *cp )
 | 
						|
;                   ++cp;           /* Find end of dst */
 | 
						|
;           while( *cp++ = *src++ )
 | 
						|
;                   ;               /* Copy src to end of dst */
 | 
						|
;           return( dst );
 | 
						|
;       }
 | 
						|
;
 | 
						|
;Entry:
 | 
						|
;       char *dst - string to which "src" is to be appended
 | 
						|
;       const char *src - string to be appended to the end of "dst"
 | 
						|
;
 | 
						|
;Exit:
 | 
						|
;       The address of "dst" in EAX
 | 
						|
;
 | 
						|
;Uses:
 | 
						|
;       EAX, ECX
 | 
						|
;
 | 
						|
;Exceptions:
 | 
						|
;
 | 
						|
;*******************************************************************************
 | 
						|
 | 
						|
page
 | 
						|
;***
 | 
						|
;char *strcpy(dst, src) - copy one string over another
 | 
						|
;
 | 
						|
;Purpose:
 | 
						|
;       Copies the string src into the spot specified by
 | 
						|
;       dest; assumes enough room.
 | 
						|
;
 | 
						|
;       Algorithm:
 | 
						|
;       char * strcpy (char * dst, char * src)
 | 
						|
;       {
 | 
						|
;           char * cp = dst;
 | 
						|
;
 | 
						|
;           while( *cp++ = *src++ )
 | 
						|
;                   ;               /* Copy src over dst */
 | 
						|
;           return( dst );
 | 
						|
;       }
 | 
						|
;
 | 
						|
;Entry:
 | 
						|
;       char * dst - string over which "src" is to be copied
 | 
						|
;       const char * src - string to be copied over "dst"
 | 
						|
;
 | 
						|
;Exit:
 | 
						|
;       The address of "dst" in EAX
 | 
						|
;
 | 
						|
;Uses:
 | 
						|
;       EAX, ECX
 | 
						|
;
 | 
						|
;Exceptions:
 | 
						|
;*******************************************************************************
 | 
						|
 | 
						|
 | 
						|
        CODESEG
 | 
						|
 | 
						|
%       public  strcat, strcpy      ; make both functions available
 | 
						|
strcpy  proc \
 | 
						|
        dst:ptr byte, \
 | 
						|
        src:ptr byte
 | 
						|
 | 
						|
        OPTION PROLOGUE:NONE, EPILOGUE:NONE
 | 
						|
 | 
						|
        push    edi                 ; preserve edi
 | 
						|
        mov     edi,[esp+8]         ; edi points to dest string
 | 
						|
        jmp     short copy_start
 | 
						|
 | 
						|
strcpy  endp
 | 
						|
 | 
						|
        align   16
 | 
						|
 | 
						|
strcat  proc \
 | 
						|
        dst:ptr byte, \
 | 
						|
        src:ptr byte
 | 
						|
 | 
						|
        OPTION PROLOGUE:NONE, EPILOGUE:NONE
 | 
						|
 | 
						|
        .FPO    ( 0, 2, 0, 0, 0, 0 )
 | 
						|
 | 
						|
        mov     ecx,[esp+4]         ; ecx -> dest string
 | 
						|
        push    edi                 ; preserve edi
 | 
						|
        test    ecx,3               ; test if string is aligned on 32 bits
 | 
						|
        je      short find_end_of_dest_string_loop
 | 
						|
 | 
						|
dest_misaligned:                    ; simple byte loop until string is aligned
 | 
						|
        mov     al,byte ptr [ecx]
 | 
						|
        add     ecx,1
 | 
						|
        test    al,al
 | 
						|
        je      short start_byte_3
 | 
						|
        test    ecx,3
 | 
						|
        jne     short dest_misaligned
 | 
						|
 | 
						|
        align   4
 | 
						|
 | 
						|
find_end_of_dest_string_loop:
 | 
						|
        mov     eax,dword ptr [ecx] ; read 4 bytes
 | 
						|
        mov     edx,7efefeffh
 | 
						|
        add     edx,eax
 | 
						|
        xor     eax,-1
 | 
						|
        xor     eax,edx
 | 
						|
        add     ecx,4
 | 
						|
        test    eax,81010100h
 | 
						|
        je      short find_end_of_dest_string_loop
 | 
						|
        ; found zero byte in the loop
 | 
						|
        mov     eax,[ecx - 4]
 | 
						|
        test    al,al               ; is it byte 0
 | 
						|
        je      short start_byte_0
 | 
						|
        test    ah,ah               ; is it byte 1
 | 
						|
        je      short start_byte_1
 | 
						|
        test    eax,00ff0000h       ; is it byte 2
 | 
						|
        je      short start_byte_2
 | 
						|
        test    eax,0ff000000h      ; is it byte 3
 | 
						|
        je      short start_byte_3
 | 
						|
        jmp     short find_end_of_dest_string_loop
 | 
						|
                                    ; taken if bits 24-30 are clear and bit
 | 
						|
                                    ; 31 is set
 | 
						|
start_byte_3:
 | 
						|
        lea     edi,[ecx - 1]
 | 
						|
        jmp     short copy_start
 | 
						|
start_byte_2:
 | 
						|
        lea     edi,[ecx - 2]
 | 
						|
        jmp     short copy_start
 | 
						|
start_byte_1:
 | 
						|
        lea     edi,[ecx - 3]
 | 
						|
        jmp     short copy_start
 | 
						|
start_byte_0:
 | 
						|
        lea     edi,[ecx - 4]
 | 
						|
;       jmp     short copy_start
 | 
						|
 | 
						|
;       edi points to the end of dest string.
 | 
						|
copy_start::
 | 
						|
        mov     ecx,[esp+0ch]       ; ecx -> sorc string
 | 
						|
        test    ecx,3               ; test if string is aligned on 32 bits
 | 
						|
        je      short main_loop_entrance
 | 
						|
 | 
						|
src_misaligned:                     ; simple byte loop until string is aligned
 | 
						|
        mov     dl,byte ptr [ecx]
 | 
						|
        add     ecx,1
 | 
						|
        test    dl,dl
 | 
						|
        je      short byte_0
 | 
						|
        mov     [edi],dl
 | 
						|
        add     edi,1
 | 
						|
        test    ecx,3
 | 
						|
        jne     short src_misaligned
 | 
						|
        jmp     short main_loop_entrance
 | 
						|
 | 
						|
main_loop:                          ; edx contains first dword of sorc string
 | 
						|
        mov     [edi],edx           ; store one more dword
 | 
						|
        add     edi,4               ; kick dest pointer
 | 
						|
main_loop_entrance:
 | 
						|
        mov     edx,7efefeffh
 | 
						|
        mov     eax,dword ptr [ecx] ; read 4 bytes
 | 
						|
 | 
						|
        add     edx,eax
 | 
						|
        xor     eax,-1
 | 
						|
 | 
						|
        xor     eax,edx
 | 
						|
        mov     edx,[ecx]           ; it's in cache now
 | 
						|
 | 
						|
        add     ecx,4               ; kick dest pointer
 | 
						|
        test    eax,81010100h
 | 
						|
 | 
						|
        je      short main_loop
 | 
						|
        ; found zero byte in the loop
 | 
						|
; main_loop_end:
 | 
						|
        test    dl,dl               ; is it byte 0
 | 
						|
        je      short byte_0
 | 
						|
        test    dh,dh               ; is it byte 1
 | 
						|
        je      short byte_1
 | 
						|
        test    edx,00ff0000h       ; is it byte 2
 | 
						|
        je      short byte_2
 | 
						|
        test    edx,0ff000000h      ; is it byte 3
 | 
						|
        je      short byte_3
 | 
						|
        jmp     short main_loop     ; taken if bits 24-30 are clear and bit
 | 
						|
                                    ; 31 is set
 | 
						|
byte_3:
 | 
						|
        mov     [edi],edx
 | 
						|
        mov     eax,[esp+8]         ; return in eax pointer to dest string
 | 
						|
        pop     edi
 | 
						|
        ret
 | 
						|
byte_2:
 | 
						|
        mov     [edi],dx
 | 
						|
        mov     eax,[esp+8]         ; return in eax pointer to dest string
 | 
						|
        mov     byte ptr [edi+2],0
 | 
						|
        pop     edi
 | 
						|
        ret
 | 
						|
byte_1:
 | 
						|
        mov     [edi],dx
 | 
						|
        mov     eax,[esp+8]         ; return in eax pointer to dest string
 | 
						|
        pop     edi
 | 
						|
        ret
 | 
						|
byte_0:
 | 
						|
        mov     [edi],dl
 | 
						|
        mov     eax,[esp+8]         ; return in eax pointer to dest string
 | 
						|
        pop     edi
 | 
						|
        ret
 | 
						|
 | 
						|
strcat  endp
 | 
						|
 | 
						|
        end
 | 
						|
 |