 IFND DOSIO_I
DOSIO_I=1
;*---------------------------------------------------------------------------
;  :Author.	Bert Jahn
;  :Contens.	macros for input/output via dos.library
;  :EMail.	wepl@kagi.com
;  :Address.	Franz-Liszt-Straße 16, Rudolstadt, 07404, Germany
;  :Version.	$Id: dosio.i 1.2 1998/12/06 13:42:20 jah Exp $
;  :History.	30.12.95 separated from WRip.asm
;		18.01.96 IFD Label replaced by IFD Symbol
;			 because Barfly optimize problems
;		20.01.96 _CheckBreak separated from Wrip
;		21.07.97 _FGetS added
;		09.11.97 _GetS added
;			 _FlushInput added
;  :Requires.	-
;  :Copyright.	© 1995,1996,1997,1998 Bert Jahn, All Rights Reserved
;  :Language.	68000 Assembler
;  :Translator.	Barfly V1.130
;---------------------------------------------------------------------------*
*##
*##	dosio.i
*##
*##	_PrintLn	outputs a linefeed
*##	_PrintArgs	outputs formatstring(a0) expanded from argarray(a1)
*##	_PrintInt	outputs a longint (d0)
*##	_Print		outputs a string(a0)
*##	_FlushInput	flushes the input stream
*##	_FlushOutput	flushes the output stream
*##	_CheckBreak	--> true(d0) if ^C was pressed
*##	_FGetS		fh(d1) buffer(d2) buflen(d3) --> buffer(d0)
*##	_GetS		buffer(a0) buflen(d0) --> buffer(d0)

	dc.b	"$Id: dosio.i 1.2 1998/12/06 13:42:20 jah Exp $"
	EVEN

		IFND	STRINGS_I
			INCLUDE	strings.i
		ENDC

;----------------------------------------
; Zeilenschaltung
; Übergabe :	-
; Rückgabe :	-

PrintLn		MACRO
	IFND	PRINTLN
PRINTLN = 1
_PrintLn	movem.l	d2/a6,-(a7)
		move.l	#$0a000000,-(a7)	;stack always LongWord aligned (speed) !
		move.l	a7,d1
		moveq	#0,d2
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOVPrintf,a6)
		movem.l	(a7)+,d0/d2/a6		; !!!
		rts
	ENDC
		ENDM

;----------------------------------------
; Gibt FormatString gebuffert aus
; Übergabe :	A0 = CPTR FormatString
;		A1 = STRUCT Array mit Argumenten
; Rückgabe :	-

PrintArgs	MACRO
	IFND	PRINTARGS
PRINTARGS = 1
_PrintArgs	movem.l	d2/a6,-(a7)
		move.l	a0,d1
		move.l	a1,d2
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOVPrintf,a6)
		movem.l	(a7)+,d2/a6
		rts
	ENDC
		ENDM

;----------------------------------------
; Gibt LongInt gebuffert aus
; Übergabe :	D0 = LONG
; Rückgabe :	-

PrintInt	MACRO
	IFND	PRINTINT
PRINTINT = 1
_PrintInt	clr.l	-(a7)
		move.l	#"%ld"<<8+10,-(a7)
		move.l	a7,a0
		move.l	d0,-(a7)
		move.l	a7,a1
		bsr	_PrintArgs
		add.w	#12,a7
		rts
	ENDC
		ENDM

;----------------------------------------
; Gibt String gebuffert aus
; Übergabe :	A0 = CPTR String
; Rückgabe :	-

Print		MACRO
	IFND	PRINT
PRINT = 1
		IFND	PRINTARGS
			PrintArgs
		ENDC

_Print		sub.l	a1,a1
		bra	_PrintArgs
	ENDC
		ENDM

;----------------------------------------
; Löschen der Ausgabepuffer
; Übergabe :	-
; Rückgabe :	-

FlushOutput	MACRO
	IFND	FLUSHOUTPUT
FLUSHOUTPUT = 1
_FlushOutput	move.l	a6,-(a7)
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOOutput,a6)
		move.l	d0,d1
		beq	.err
		jsr	(_LVOFlush,a6)
.err		move.l	(a7)+,a6
		rts
	ENDC
		ENDM

;----------------------------------------
; Übergabe :	-
; Rückgabe :	-

FlushInput	MACRO
	IFND	FLUSHINPUT
FLUSHINPUT = 1
_FlushInput	move.l	a6,-(a7)
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOInput,a6)
		move.l	d0,d1
		beq	.err
		jsr	(_LVOFlush,a6)
.err		move.l	(a7)+,a6
		rts
	ENDC
		ENDM

;----------------------------------------
; Check break (CTRL-C)
; Übergabe :	-
; Rückgabe :	d0 = BOOL break

CheckBreak	MACRO
	IFND	CHECKBREAK
CHECKBREAK=1
	IFND	PRINT
		Print
	ENDC
_CheckBreak	move.l	a6,-(a7)
		move.l	#SIGBREAKF_CTRL_C,d1
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOCheckSignal,a6)
		tst.l	d0
		beq	.end
		lea	(.break),a0
		bsr	_Print
		moveq	#-1,d0
.end		move.l	(a7)+,a6
		rts
.break		dc.b	"*** User Break ***",10,0
	EVEN
	ENDM

;----------------------------------------
; get line from file
; remove all LF,CR,SPACE,TAB from the end of line
; IN :	D1 = BPTR  fh
;	D2 = APTR  buffer
;	D3 = ULONG buffer size
; OUT :	D0 = ULONG buffer or 0 on error/EOF

FGetS	MACRO
	IFND	FGETS
FGETS=1
		IFND	STRLEN
			StrLen
		ENDC
_FGetS		movem.l	d3/a6,-(a7)
		subq.l	#1,d3			;due a bug in V36/V37
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOFGets,a6)
		move.l	d0,-(a7)
		beq	.end
	;remove LF,CR,SPACE,TAB from the end
		move.l	(a7),a0
		bsr	_StrLen
.len		tst.l	d0
		beq	.end
		move.l	(a7),a0
		cmp.b	#10,(-1,a0,d0)		;LF
		beq	.cut
		cmp.b	#13,(-1,a0,d0)		;CR
		beq	.cut
		cmp.b	#" ",(-1,a0,d0)		;SPACE
		beq	.cut
		cmp.b	#"	",(-1,a0,d0)	;TAB
		bne	.end
.cut		clr.b	(-1,a0,d0)
		subq.l	#1,d0
		bra	.len
.end		movem.l	(a7)+,d0/d3/a6
		rts
	ENDC
		ENDM

;----------------------------------------
; get line from stdin
; remove all LF,CR,SPACE,TAB from the end of line
; IN :	D0 = ULONG buffer size
;	A0 = APTR  buffer
; OUT :	D0 = ULONG buffer or 0 on error/EOF

GetS	MACRO
	IFND	GETS
GETS=1
		IFND	FGETS
			FGetS
		ENDC
_GetS		movem.l	d2-d3/a6,-(a7)
		move.l	d0,d3			;buffer size
		move.l	a0,d2			;buffer
		move.l	(gl_dosbase,GL),a6
		jsr	(_LVOInput,a6)
		move.l	d0,d1			;fh
		bsr	_FGetS
		movem.l	(a7)+,_MOVEMREGS
		rts
	ENDC
		ENDM

;----------------------------------------
	
 ENDC

