.386
LOCALS

.MODEL	FLAT


L			EQU	<LARGE>

;Значения параметра функции GetStdHandle
STD_INPUT_HANDLE	EQU	-10
STD_OUTPUT_HANDLE	EQU	-11
STD_ERROR_HANDLE	EQU	-12

BUFFER_SIZE		EQU	1024	;размер буфера для форматированного вывода


EXTRN	wvsprintfA:PROC
EXTRN	lstrlenA:PROC
EXTRN	WriteFile:PROC


.DATA?

PUBLIC	hStdOut

hStdOut		DD	?	;описатель стандартного устройства вывода


.CODE

PUBLIC	printf
PUBLIC	puts
PUBLIC	fputs

;*******************************************************************************
;printf		осуществляет форматированный вывод на стандартное устройство
;		вывода
;*******************************************************************************
;Использует:	wvsprintf, WriteFile
;
;Вызов:		lpszFormat -> строка формата
;		...
;
;Возврат:	EAX = количество выведенных символов
;
;Изменяемые
;  регистры:	ESP,EAX,ECX,EDX,Flags
;*******************************************************************************
printf		PROC	C
		ARG	@@lpszFormat:DWORD
		LOCAL	@@szBuffer:BYTE:BUFFER_SIZE, @@dwNumBytes:DWORD

		lea	eax,[@@lpszFormat+4]	;EAX -> дополнительные параметры
		push	eax
		push	[@@lpszFormat]
		lea	eax,[@@szBuffer]
		push	eax
		call	wvsprintfA		;EAX = число символов в буфере

		push	L 0
		lea	ecx,[@@dwNumBytes]
		push	ecx
		push	eax
		lea	eax,[@@szBuffer]
		push	eax
		push	[hStdOut]
		call	WriteFile		;EAX = флаг успешного/неудачного
						;завершения
		or	eax,eax
		jz	@@Exit

		mov	eax,[@@dwNumBytes]

@@Exit:
		ret

printf		ENDP

;*******************************************************************************
;puts		выводит строку на стандартное устройство вывода
;*******************************************************************************
;Использует:	fputs
;
;Вызов:		lpszString -> выводимая строка
;
;Возврат:	EAX = количество выведенных символов
;
;Изменяемые
;  регистры:	EAX,ECX,EDX,Flags
;*******************************************************************************
puts		PROC	NEAR

		push	DWORD PTR [esp+4]	;ESP+4 -> lpszString
		push	[hStdOut]
		call	fputs			;EAX = количество выведенных
						;символов

		ret	4

puts		ENDP

;*******************************************************************************
;fputs		выводит строку в файл
;*******************************************************************************
;Использует:	lstrlenA, WriteFile
;
;Вызов:		hFile = описатель файла
;		lpszString -> выводимая строка
;
;Возврат:	EAX = количество выведенных символов
;
;Изменяемые
;  регистры:	EAX,ECX,EDX,Flags
;*******************************************************************************
fputs		PROC	STDCALL
		ARG	@@hFile:DWORD, @@lpszString:DWORD
		LOCAL	@@dwNumBytes:DWORD

		push	[@@lpszString]
		call	lstrlenA		;EAX = длина строки

		push	L 0
		lea	ecx,[@@dwNumBytes]
		push	ecx
		push	eax
		push	[@@lpszString]
		push	[@@hFile]
		call	WriteFile		;EAX = флаг успешного/неудачного
						;завершения
		or	eax,eax
		jz	@@Exit

		mov	eax,[@@dwNumBytes]

@@Exit:
		ret

fputs		ENDP


END
