; ---------------------------------------------------------------------------
; S t r i n g   c o n v e r t e r   ( r e p l a c e r )
;
; Набор функций для работы со строками. Позволяет модифицировать строки в Clipper
; _независимо_от_языка_ (русский/английский) для 866cp
;
; void FirstUpR   (char szLine) Конвертит строку в нижний  регистр, первая буква заглавная
; void All2UpperR (char szLine) Конвертит строку в верхний регистр (аналог Upper(szLine))
; void All2LowerR (char szLine) Конвертит строку в нижний  регистр (аналог Lower(szLine))
; 
; Поскольку все функции пользуются одним и тем же типом и количеством :)
; входного параметра, то и используют они все фактически общий код
; (FirstUpR), предварительно установив флаг признака вызванной функции
;
; Собственно рабочие функции U2Lower и L2Upper живут в StrWFunc.asm
;
; Исходная строка _меняется_.
;
; (с) WhiteUnicorn, 01.02.2000, Freeware, WhiteUnicorn@mail.ru
; ---------------------------------------------------------------------------
 

include	extenda.inc				; МАсмовский файл
extrn		U2Lower:far, L2Upper:far	; Живут в StrWFunc.asm

CLpublic <FirstUpR, All2UpperR, All2LowerR>

; ---------------------------------------------------------------------------
; F u n c t i o n 
; char FirstUp (char szLine)
;
; Конвертим строку в нижний регистр, первая буква заглавная
; Исходная строка _меняется_
;
; Фактически тело этой функции является рабочим еще для двух других,
; поэтому обращаться с ней надо осторожно :)
; ---------------------------------------------------------------------------

CLfunc void FirstUpR <char szLine>

CLcode
;	int	03h				; Это для отладки

	mov	dx,00h			; Признак, что вызвана FirsUpR

 TestParam:					; Проверяем количество переданных параметров
	cmp	PCOUNT,1
	je	TestLine
	jmp	ErrorExit

 TestLine:					; и не пустая ли строка
	TESTNUL	szLine
	jnz	StartWork
	jmp	ErrorExit	

 StartWork:
 	push	ds				; Обязательно сохраняем сегментные регистры
	push	es				; перед их изменением
	lds	si, szLine			; Воткнули ds:[si] и es:[di] на нашу строку
	les	di, szLine
	mov	cx, word ptr ds:[si-02h]	; Тут должна лежать длина строки

	cmp	dx,01h			; Вызвана All2UpperR ?
	je	WF01_ModifyData
	cmp	dx,02h			; Вызвана All2LowerR ?
	je	WF02_ModifyData
	jmp	ModifyData			; Вызвана FirstUpR ?
 WF01_ModifyData:
	call	L2Upper		; Все буквы конвертим в верхний регистр
	jmp	Exit
 WF02_ModifyData:
	call	U2Lower		; Все буквы конвертим в нижний регистр
	jmp	Exit

 ModifyData:
	push	cx
	mov	cx, 01h
	call	L2Upper		; первую букву делаем заглавной
	pop	cx
	sub	cx,1
	call	U2Lower		; остальные - строчными

 Exit:
	pop	es			; Восстанавливаем сегментные регистры
	pop	ds

 ErrorExit:				; Аварийный выход :)

CLret

; ---------------------------------------------------------------------------
; F u n c t i o n 
; void All2Upper (char szLine)
;
; Конвертим строку в верхний регистр
; Исходная строка _меняется_
;
; Все действия выполняются в функции FirstUp, здесь просто задается флаг функции
; ---------------------------------------------------------------------------

CLfunc void All2UpperR <char szLine>

CLcode
;	int	03h

	mov	dx,01h		; Признак, что вызвана All2UpperR
	jmp	TestParam		; И навсегда ушли в FirsUpR 

CLret

; ---------------------------------------------------------------------------
; F u n c t i o n 
; void All2Lower (char szLine)
;
; Конвертим строку в нижний регистр
; Исходная строка _меняется_
;
; Все действия выполняются в функции FirstUp, здесь просто задается флаг функции
; ---------------------------------------------------------------------------

CLfunc void All2LowerR <char szLine>

CLcode
;	int	03h

	mov	dx,02h		; Признак, что вызвана All2LowerR
	jmp	TestParam		; И навсегда ушли в FirsUpR

CLret

; ---------------------------------------------------------------------------
; E n d   o f   b a s e   f u n c t i o n s
; ---------------------------------------------------------------------------

END