105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| 	page	,132
 | |
| 	title	strupr - map string to upper-case
 | |
| ;***
 | |
| ;strupr.asm - routine to map lower-case characters in a string to upper-case
 | |
| ;
 | |
| ;	Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
 | |
| ;
 | |
| ;Purpose:
 | |
| ;	_strupr() converts lower-case characters in a null-terminated string
 | |
| ;	to their upper-case equivalents.  Conversion is done in place and
 | |
| ;	characters other than lower-case letters are not modified.
 | |
| ;
 | |
| ;	This function modifies only 7-bit ASCII characters
 | |
| ;	in the range 0x61 through 0x7A ('a' through 'z').
 | |
| ;
 | |
| ;Revision History:
 | |
| ;	04-21-87  SKS	Rewritten to be fast and small, added file header
 | |
| ;	05-18-88  SJM	Add model-independent (large model) ifdef
 | |
| ;	08-04-88  SJM	convert to cruntime/ add 32-bit support
 | |
| ;	08-19-88  JCR	Minor optimization
 | |
| ;	10-10-88  JCR	Changed an 'xchg' to 'mov'
 | |
| ;	10-26-88  JCR	General cleanup for 386-only code
 | |
| ;	10-26-88  JCR	Re-arrange regs to avoid push/pop ebx
 | |
| ;	03-26-90  GJF	Changed to _stdcall. Also, fixed the copyright.
 | |
| ;	01-18-91  GJF	ANSI naming.
 | |
| ;	05-10-91  GJF	Back to _cdecl, sigh...
 | |
| ;
 | |
| ;*******************************************************************************
 | |
| 
 | |
| 	.xlist
 | |
| 	include cruntime.inc
 | |
| 	.list
 | |
| 
 | |
| page
 | |
| ;***
 | |
| ;char *_strupr(string) - map lower-case characters in a string to upper-case
 | |
| ;
 | |
| ;Purpose:
 | |
| ;	Converts all the lower case characters in string to upper case
 | |
| ;	in place.
 | |
| ;
 | |
| ;	Algorithm:
 | |
| ;	char * _strupr (char * string)
 | |
| ;	{
 | |
| ;	    char * cp = string;
 | |
| ;
 | |
| ;	    while( *cp )
 | |
| ;	    {
 | |
| ;		if ('a' <= *cp && *cp <= 'z')
 | |
| ;		    *cp += 'A' - 'a';
 | |
| ;		++cp;
 | |
| ;	    }
 | |
| ;	    return(string);
 | |
| ;	}
 | |
| ;
 | |
| ;Entry:
 | |
| ;	char *string - string to change to upper case
 | |
| ;
 | |
| ;Exit:
 | |
| ;	The input string address is returned in AX or DX:AX
 | |
| ;
 | |
| ;Uses:
 | |
| ;	BX, CX, DX
 | |
| ;
 | |
| ;Exceptions:
 | |
| ;
 | |
| ;*******************************************************************************
 | |
| 
 | |
| 	CODESEG
 | |
| 
 | |
| 	public	_strupr
 | |
| _strupr proc \
 | |
| 	string:ptr byte
 | |
| 
 | |
| 
 | |
| 	mov	ecx,[string]	; cx = *string
 | |
| 	mov	edx,ecx 	; save return value
 | |
| 	jmp	short first_char; jump into the loop
 | |
| 
 | |
| 	align	@WordSize
 | |
| check_char:
 | |
| 	sub	al,'a'		; 'a' <= al <= 'z' ?
 | |
| 	cmp	al,'z'-'a'+1
 | |
| 	jnb	short next_char
 | |
| 	add	al,'A'		; map to upper case
 | |
| 	mov	[ecx],al	; and store new value
 | |
| next_char:
 | |
| 	inc	ecx		; bump pointer
 | |
| first_char:
 | |
| 	mov	al,[ecx]	; get next character
 | |
| 	or	al,al
 | |
| 	jnz	short check_char
 | |
| 
 | |
| done:
 | |
| 	mov	eax,edx 	; ax = return value ("string")
 | |
| 
 | |
| ifdef	_STDCALL_
 | |
| 	ret	DPSIZE		; _stdcall return
 | |
| else
 | |
| 	ret			; _cdecl return
 | |
| endif
 | |
| 
 | |
| _strupr endp
 | |
| 	end
 |