********************************************************************************
*
*	Program:	Carriage Return
*	Filename:	Main.a
*
*	Usage:		CarriageReturn SourceFile DestinationFile ADD|STRIP
*
*	Contents:	ADD: fügt bei jedem Linefeed ($0A) im SourceFile
*			     ein Carriage Return ($0D) ein. Das Ergebnis ist
*			     das DestinationFile.
*			STRIP: Wie ADD, jedoch werden alle Carriage Return ($0D)
*			       entfernt.
*
*	Language:	68000 Assembler
*
*	Link-instr.:	Objects:   Astartup.o Main.o
*			Libraries: amiga.lib amigavisions.lib
*			Output:    CarriageReturn
*
*	Author:		Johannes R. Geiss
*
*	Copyright:	Amigavisions
*
*	History:	$HISTORY:
*			1.4 (17-Oct-92) changed JRG
*			1.3 (15-Oct-91) changed JRG
*			1.2 (14-Oct-91) changed JRG
*			1.1 (07-Oct-91) changed JRG
*			1.0 (03-Oct-91) written JRG
*
*	Version:	$VER: CarriageReturn 1.4 (17-Oct-92)
*
********************************************************************************


*------ Includes
	include 'xref.i'
	include 'call.i'
	include 'libraries/dosextens.i'


*------ Imports
	XLIB	Write
	XLIB	FreeMem
	XLIB	Open
	XLIB	Close
	XLIB	IoErr
	xref	GetCommand
	xref	OpenData
	xref	Print
	xref	DOSError
	xref	_DOSBase
	xref	_SysBase
	xref	_exit


*------ Exports
	xdef	_main


********************************************************************************

	SECTION CarriageReturn

*------ Main procedure
_main	move.l	4(a7),d0		; restore Parameterstring
	beq	RetOK			; return if WB
	movea.l 8(a7),a0

	addq.l	#4,a0
	move.l	(a0)+,SourceFilename	; get source & dest. Filename
	move.l	(a0)+,DestinationFilename
	movea.l a0,a2

	movea.l SourceFilename,a0	; info ?
	cmpi.b	#'?',(a0)
	bne.s	Cont2
	moveq.l #RETURN_OK,d0
Err1	move.l	d0,-(a7)
Err3	bsr	DOSError
	movea.l #InfoText,a0
	bsr	Print
	bsr	_exit

Cont2	cmpi.b	#4,d0			; test syntax
	bcc.s	Cont1
Err2	move.l	#ERROR_INVALID_COMPONENT_NAME,d0
	bra.s	Err1

Cont1	movea.l (a2),a0			; get command
	movea.l #CmdTab,a1
	bsr	GetCommand
	move.l	d0,CmdNr
	beq.s	Err2

	movea.l SourceFilename,a0	; Open sourcefile Daten
	bsr	OpenData
	tst.l	d0
	bne.s	Err1
	move.l	a0,DataAddress
	move.l	d1,DataLen

	cmpi.l	#1,CmdNr		; execute Add/Strip
	bne.s	Cont5
	bsr.s	AddCR
	bra.s	Cont6
Cont5	bsr	StripCR

Cont6	movea.l DataAddress,a1		; Free memory
	move.l	DataLen,d0
	CALLEXE FreeMem

RetOK	moveq.l #RETURN_OK,d0		; return-code ok

Exit_Am move.l	d0,-(a7)		; save return-code
	bsr	_exit


*------ Add Carriage Return
AddCR	bsr	OpenWR
	movea.l DataAddress,a5
	movea.l DataLen,a4
	adda.l	a5,a4
Loop2	move.l	a5,d6
	moveq.l #0,d3
Loop1	addq.l	#1,d3
	cmpa.l	a5,a4
	beq.s	EndAdd
	cmpi.b	#$0a,(a5)+
	bne.s	Loop1
	bsr.s	Wrt
	bsr.s	WrtCR
	bra.s	Loop2
EndAdd	bsr.s	Wrt
	bsr	CloseWR
	rts


*------ Write CR
WrtCR	move.l	d7,d1
	move.l	#CRChar,d2
	moveq.l #2,d3
	CALLSYS Write
	tst.l	d0
	bpl.s	WrtOK
Err5	CALLSYS IoErr
	move.l	d0,-(a7)
	bsr	CloseWR
	bra	Err3
WrtOK	rts


*------ Write buffer
Wrt	move.l	d7,d1
	move.l	d6,d2
	subq.l	#1,d3
	CALLSYS Write
	tst.l	d0
	bmi.s	Err5
	rts


*------ Strip Carriage Return
StripCR bsr.s	OpenWR
	movea.l DataAddress,a5
	movea.l DataLen,a4
	adda.l	a5,a4
Loop4	move.l	a5,d6
	moveq.l #0,d3
Loop3	addq.l	#1,d3
	cmpa.l	a5,a4
	beq.s	EndAdd
	cmpi.b	#$0d,(a5)+
	bne.s	Loop3
	bsr.s	Wrt
	bra.s	Loop4
EndStr	bsr.s	Wrt
	bsr.s	CloseWR
	rts


*------ Open write file
OpenWR	move.l	DestinationFilename,d1
	move.l	#MODE_NEWFILE,d2
	CALLDOS Open
	move.l	d0,d7
	bne.s	OpOK
	CALLSYS IoErr
	bra	Err1
OpOK	rts


*------ Close write file
CloseWR move.l	d7,d1
	CALLSYS Close
	rts


********************************************************************************

	section DATA

*------ Datafield
SourceFilename		dc.l	0
DestinationFilename	dc.l	0
InfoText		dc.b	$0a,$9b,'1;33mCarriageReturn V1.4',$9b,'0;33m'
			dc.b	' Copyright (C) 1991, Amigavisions'
			dc.b	$9b,'0m',$0a
			dc.b	$0a,'Usage: CarriageReturn SourceFilename'
			dc.b	' DestinationFilename ADD|STRIP',$0a
			dc.b	'   ADD: adds Carriage Return ($0D) before'
			dc.b	' every Linefeed ($0A),',$0a
			dc.b	' STRIP: strips all Carriage Returns',$0a,$0a,0
CmdTab			dc.b	'ADD',0
			dc.b	'STRIP',0,0
CRChar			dc.b	$0d,$0a


********************************************************************************

	section BSS

*------ BSSfield
CmdNr		ds.l	1
DataAddress	ds.l	1
DataLen		ds.l	1

	END
