;************************************************************************************* ; MODULE: STRING.INC DATE: FEBRUARY 2, 1997 ; AUTHOR: SEAN M. KESSLER ; TARGET: 32 BIT FLAT MODEL ; FUNCTION : STRING RELATED MACROS ;************************************************************************************* STRSTR MACRO szStringOne,szStringTwo push offset szStringTwo ; save string one push offset szStringOne ; save string two call _strstr ; call standard library strstr add esp,08h ; reset stack frame ENDM STRCHR MACRO szString,charByte push charByte ; save charByte push offset szString ; save string call _strchr ; call standard library strchr add esp,08h ; reset stack frame ENDM STRCAT MACRO szDstString,szSrcString push offset szSrcString ; save source string push offset szDstString ; save destination string call _strcat ; call standard library strcat add esp,08h ; reset stack frame ENDM STRLEN MACRO szData push edi ; save destination index register push ecx ; save ecx register mov edi,offset szData ; get string to destination index register mov ecx,0FFFFh ; move 65535 to ecx register xor eax,eax ; clear eax register repnz scasb ; scan string mov eax,0FFFFh ; move 65535 to eax sub eax,ecx ; subtract number of bytes scanned dec eax ; decrement result pop ecx ; restore ecx register pop edi ; restore destination index register ENDM MEMCPY MACRO szDstData,szSrcData,lengthCopy push esi ; save source index register push edi ; save destination index register mov esi,offset szSrcData ; move source data to source index register mov edi,offset szDstData ; move destination data to destination index register mov ecx,lengthCopy ; move number of bytes to copy to ecx register rep movsb ; copy data pop edi ; restore destination index register pop esi ; restore source index register ENDM MEMSET MACRO szBuffer,setFill,length push edi ; save destination index register mov edi,szBuffer ; move szBuffer into edi register mov eax,setFill ; move value to set into eax register mov ecx,length ; move count of bytes to ecx register rep stosb ; set data pop edi ; restore destination index register ENDM STRCMP MACRO szStringOne,szStringTwo LOCAL @@STRCMPnotEqual,@@STRCMPequal,@@STRCMPexit push ecx ; save ecx register push edi ; save destination index register push esi ; save source index register mov edi,offset szStringOne ; move string one to destination index register mov esi,offset szStringTwo ; move string two to source index register STRLEN szStringOne ; get length of string one mov ecx,eax ; save length to ecx register STRLEN szStringTwo ; get length of string two cmp ecx,eax ; compare lengths jne @@STRCMPnotEqual ; if lengths differ, strings are not equal @@STRCMPloop: ; loop control mov al,byte ptr[esi] ; get byte from string two cmp al,byte ptr[edi] ; compare with byte from string one jne @@STRCMPnotEqual ; if bytes differ then we're done loop @@STRCMPloop ; iterate through string length @@STRCMPequal: ; equality control mov eax,0001h ; set return code jmp @@STRCMPexit ; we're done @@STRCMPnotEqual: ; inequality control xor eax,eax ; set return code @@STRCMPexit: ; exit sync address pop esi ; restore source index register pop edi ; restore destination index register pop ecx ; restore ecx register ENDM STRNCMP MACRO szStringOne,szStringTwo LOCAL @@STRNCMPloop,@@STRNCMPequal,@@STRNCMPnotEqual,@@STRNCMPexit push ecx ; save ecx register push edi ; save edi register push esi ; save source index register mov edi,offset szStringOne ; move string one to destination index register mov esi,offset szStringTwo ; move string two to source index register STRLEN szStringOne ; get length of string one mov ecx,eax ; save length to ecx register STRLEN szStringTwo ; get length of string two cmp ecx,eax ; compare the lengths jle @@STRNCMPloop ; string one is less equal to string two mov ecx,eax ; string two is less, so use it's length @@STRNCMPloop: ; loop control mov al,byte ptr[esi] ; get byte from string one cmp al,byte ptr[edi] ; compare with byte from string two jne @@STRNCMPnotEqual ; if byte are unequal, strings are unequal inc edi ; increment along string two inc esi ; increment along string one loop @@STRNCMPloop ; keep going @@STRNCMPequal: ; string equal sync address mov eax,0001h ; set return code jmp @@STRNCMPexit ; we're done @@STRNCMPnotEqual: ; string unequal sync address xor eax,eax ; set return code @@STRNCMPexit: ; exit sync address pop esi ; restore source index register pop edi ; restore destination index register pop ecx ; restore ecx register ENDM extrn _strstr:near extrn _strchr:near extrn _strcat:near