' ___________________________________________________________________________
' |*************************************************************************|
' |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
' |*| Set TAB to 4 for best readable file layout.  |*|  Maxon Basic 3.00  |*|
' |*|______________________________________________|*|____________________|*|
' |*************************************************************************|
' |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
' |*|               |*|  $Id: extra.bc (19.03.01)                         |*|
' |*| ###### ###### |*|  RhoSigma Source based on NDK 3.1 Includes 40.15  |*|
' |*| ##  ## ##   # |*| _________________________________________________ |*|
' |*| ##  ##  ##    |*|                                                   |*|
' |*| ######   ##   |*|  The public BASIC definitions for extra.library   |*|
' |*| ##      ##    |*|                                                   |*|
' |*| ##     ##   # |*| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |*|
' |*| ##     ###### |*|  Copyright © 1998-2001 RhoSigma, Roland Heyder    |*|
' |*|               |*|  All Rights Reserved.                             |*|
' |*|_______________|*|___________________________________________________|*|
' |*************************************************************************|
' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

' ACHTUNG: Im Hauptmodul muß VOR "$INCLUDE extra.bc bzw. -.bh" die Datei
'		   "rhosigma/settings.bc" includiert werden, damit diese Include-Datei
'		   richtig funktioniert. Ansonsten könnte es vorkommen, daß gar kein
'		   oder unvollständiger Code generiert wird.

'		   SCHREIBEN SIE DIE INCLUDE-ANWEISUNG NICHT AN DEN KOPF DIESER DATEI !!
'		   ICH HABE DAS SCHON ALLES AUSPROBIERT, WAS JEDESMAL EINEN SOFORTIGEN
'		   SYSTEM-ABSTURZ ZUR FOLGE HATTE !!

'$UNDERLINES

'---------- die BufInfoBlock-Struktur von »BufInfo()« -----------------------

CONST bib_OwnerID%		= 0   '(APTR)  Task, der diesen Puffer öffnete
CONST bib_MaxSize%		= 4   '(ULONG) momentane Größe des Datenbereichs in Byte
CONST bib_FreeSize%		= 8   '(ULONG) davon momentan noch unbenutzt
CONST bib_DataStart%	= 12  '(APTR)  Adresse des gegenwärtigen Datenbereichs
CONST bib_CurPos%		= 16  '(ULONG) aktuelle Cursorposition (Zählbeginn=0 !!)
CONST bib_EndPos%		= 20  '(ULONG) aktuelle Anfügeposition
CONST bib_LastFind%		= 24  '(APTR)  Zeiger auf zuletzt gesuchte Daten od. 0-PTR
CONST bib_FindSize%		= 28  '(ULONG) die Länge obiger Such-Daten oder null
CONST bib_KeyNum%		= 32  '(ULONG) der Schlüssel der o.g. Such-Daten oder -1
'------------------------------------- neu ab v2.062
CONST bib_DataMemType%	= 36  '(ULONG) Speicherflags des Datenbereichs CHIP/FAST etc.
CONST bib_SizeOf%		= 40

'---------- Modes für »SeekBuf()« -------------------------------------------

CONST SKM_Current%	= 0		'Positionierung relativ zur gegenwärtigen CurPos
CONST SKM_Start%	= 1		'Positionierung relativ zum Pufferanfang
CONST SKM_End%		= 2		'Positionierung relativ zum Pufferende
CONST SKM_Bookmark%	= 3		'»Position« = Nummer der gewünschten Bookmark

'---------- die Parameter-Struktur für »UnpackByteRun1()« -------------------

CONST up_InBuf%		= 0		'(APTR)  Zeiger auf die gepackten Daten
CONST up_InLen%		= 4		'(ULONG) die Größe des gepackten Bereichs in Byte
CONST up_Private%	= 8		'(ULONG) beim ersten Aufruf unbedingt auf 0 setzen
CONST up_SizeOf%	= 12

'---------- Styles, Masken u. Flags für »SpecTextPrefs()« -------------------

'** Styles **
CONST STS_Plain%	 = 0	'normaler Text		  \
CONST STS_Underline% = 1	'unterstrichener Text |  können durch Addition oder
CONST STS_Bold%		 = 2	'fettgedruckter Text  |  log. ODER kombiniert werden
CONST STS_Italic%	 = 4	'kursiver Text		  /

'** Masken **
CONST STM_Normal%	= &H0	'keine Umrandung, d.h. normale Textausgabe
CONST STM_Outline%	= &Hff	'volle Umrandung
CONST STM_Shadow%	= &H1c	'Schatten unten/rechts sichtbar
CONST STM_Ghost%	= &Hc1	'dies wirkt am besten, wenn Sie als »MPen«
							'die selbe Farbe verwenden, wie der Hinter-
							'grund hat

'** Flags **
CONST STF_FJAM2&	= 1	 'Normalerweise benutzt »SpecText()« den DrawMode JAM1,
						 'mit diesem Flag wird jedoch JAM2 erzwungen.
CONST STF_AP2MP&	= 2	 'immer der gerade eingestellte »APen« des RastPorts
						 'soll als »MainPen« (MPen) verwendet werden
CONST STF_BP2TL&	= 4	 'immer der gerade eingestellte »BPen« des RastPorts
						 'soll als »TopLeftPen« (TLPen) verwendet werden
CONST STF_OP2BR&	= 8	 'immer der gerade eingestellte »OPen« des RastPorts
						 'soll als »BottomRightPen« (BRPen) verwendet werden
CONST STF_PSWAP&	= 16 'vertauscht »TLPen« u. »BRPen«, d.h. »TLPen« wird für
						 'un./re. und »BRPen« für ob./li. verwendet

' Die folgenden Flags haben keinen Einfluß auf die Arbeitsweise der Funk-
' tion »SpecText()«. Sie dienen nur dazu, »SpecTextPrefs()« mitzuteilen,
' welche Parameter neu eingestellt werden sollen. Damit soll überflüssiges
' Register-retten verhindert werden, da Sie nicht jedem Register, welches
' von »SpecTextPrefs()« erwartet wird, zwangsläufig einen sinnvollen Wert
' zuweisen müssen. Wenn Sie z.B. mit D0-D5 irgendwelche Berechnungen machen,
' oder sie als Schleifenzähler benutzen, und wollen dann den »MPen« ver-
' ändern, dann brauchen Sie nur D0 mit diesem zu initialisieren und D5 das
' entsprechende Flag (STF_CMPEN) zuweisen, während Sie sich um D1-D4 nicht
' sorgen müssen, da diese bei jenem Aufruf vollkommen unberührt und unver-
' ändert bleiben, d.h. sie müssen weder gerettet noch initialisiert werden.
'
' ACHTUNG: Wenn keines der folgenden Flags angegeben wird, dann heißt das
' ¯¯¯¯¯¯¯¯ nicht, daß KEIN Wert geändert werden soll, sondern daß ALLE Werte
'          zu ändern sind !! (In diesem Falle müssen dann logischer Weise
'							  auch alle Register initialisiert werden.)

CONST STF_CMPEN&	= 1024	'Nur den »MPen« auf den angegebenen Wert ändern.
CONST STF_TLPEN&	= 2048	'Nur den »TLPen« auf den angegebenen Wert ändern.
CONST STF_BRPEN&	= 4096	'Nur den »BRPen« auf den angegebenen Wert ändern.
CONST STF_STYLE&	= 8192	'Nur den SoftStyle auf den angegebenen Wert ändern.
CONST STF_CMASK&	= 16384	'Nur die Maske auf den angegebenen Wert ändern.
CONST STF_FLAGS&	= 32768	'Nur die Flags auf den angegebenen Wert ändern.

' Es können auch alle Kombinationen der obigen Flags angegeben werden. Die
' Funktion »SpecTextPrefs()« wird dann alles das, was Sie wünschen, ändern.

'---------- Fehlernummern von »LastError()« ---------------------------------

CONST NoError%		=  0	'bis jetzt ist kein Fehler aufgetreten

'** DBS-Funktionen **
CONST BufInvalid%	=  10	'die angegebene Adresse war kein BufHandle
CONST NotOwner%		=  11	'nur der Task, der den Puffer öffnete, darf ihn auch wieder schließen
CONST NoBufMemory%	=  12	'nicht mehr genügend Speicher frei (PUBLIC)
CONST NoDOSProcess%	=  13	'die aufrufende Anwendung war kein DOS-Prozess
CONST IoErrRequired%=  14	'ein DOS-Error ist aufgetreten (»IoErr()« der dos.library aufrufen)
CONST SeekBadMode%	=  15	'der angegebene »SeekMode« ist unbekannt
CONST SeekOffsetErr%=  16	'gewünschte »Position« unter-/überschreitet den Pufferanfang bzw. das Pufferende
CONST NoFindMem%	=  17	'kein Speicher für Zwischenspeicherung der zu suchenden Daten (PUBLIC)
CONST FindTooLong%	=  18	'von CurPos bis EndPos bzw. Pufferanfang sind nur noch weniger Daten, als gesucht werden sollen
CONST NoFindAvail%	=  19	'für »FindNext()/FindPrev()« ist mindestens ein »FindData()« erforderlich (gilt für jeden möglichen Schlüssel)
CONST InvalidKey%	=  20	'ein angegebener Schlüssel liegt außerhalb des gültigen Bereichs (bei Find-Funktionen max. 8 (0-7) / bei Bookmarks max. 16 (0-15))
CONST MarkNotSet%	=  21	'die angegebene Bookmark ist noch nicht gesetzt
CONST MarkCleared%	=  22	'die Daten an der angegebenen Bookmark wurden durch »Clear()« gelöscht

'** StringToLong() **
CONST ResultValid%	=  30	'alles in Ordnung (das Ergebnis ist gültig)
CONST InvalidChar%	=  31	'im String wurde ein illegales Zeichen gefunden
CONST Overflow%		=  32	'repräsentierte Zahl wäre größer als 32 Bit (LONG)

'** FillMem() **
CONST OddAddress%	=  35	'ungerade Startadresse bei WORD- oder LONG-Modus
CONST NotFilled%	=  36	'keine Füllung wegen Abrundung (Bereich zu klein, um wenigstens 1 Wert aufzunehmen)

'** ShowMsg() **
CONST BadHeight%	=  40	'angegebene Höhe war größer als 200 Videozeilen
CONST NoStructMem%	=  41	'kein Speicher für benötigte Gfx-Strukturen (ANY)
CONST NoChipMemory%	=  42	'nicht genügend Speicher für die BitPlanes (CHIP)
CONST SpecTextErr%	=  43	'die Funktion »SpecText()« hat einen Fehler gemeldet

'---------- die Basis-Struktur der extra.library ----------------------------

CONST xb_Copyright%	= 34	'(APTR) ein einzeiliger Copyrightvermerk(+0)
CONST xb_Private%	= 38	'ab hier 54 Bytes privater Datenbereich der Library
CONST xb_SizeOf%	= 92

'---------- von der extra.library erzeugte Alert's --------------------------

CONST EL_AlertD&	 =	&HB5000000
CONST EL_AlertR&	 =	&H35000000
'Typen-Kennungen der extra.library ($B5000000=DeadEnd/$35000000=Recovery)

CONST EL_NoDfo&		 =	&HB503800B
'konnte diskfont.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen

CONST EL_NoDOS&		 =	&HB5038007
'konnte dos.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen

CONST EL_NoGfx&		 =	&HB5038002
'konnte graphics.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen

CONST EL_NoInt&		 =	&HB5038004
'konnte intuition.library V33+ (bzw. V36+ für CGX-Version) nicht öffnen

CONST EL_Trespassed& =	&HB5068035
'Task hat Library benutzt, ohne sie vorher zu öffnen

'---------- mit extra.library verwendbare SUB-Routinen ----------------------

CONST SMTPOS_C%	= -1	'Text zentrieren
CONST SMTPOS_L%	= -2	'Text linksbündig
CONST SMTPOS_R%	= -3	'Text rechtsbündig

'*** extra.library / SMCOLOR() ***
'============================================================================
' Diese Routine erstellt einen Farbeintrag für die optional anzugebende Farb-
' tabelle für die Funktion »ShowMsg()«.
'----------------------------------------------------------------------------
' Definiert:	extra.bc  (Copyright © 1998-2001 RhoSigma, Roland Heyder)
'
' Schablone:	Pen%/A/N, Red%/A/N, Green%/A/N, Blue%/A/N, EndFlag%/K/S
'
' Parameter:	Pen%	 --> Nr. des zu ändernden Farbstiftes (3-15)
'								(0-2 sind reserviert u. werden ignoriert)
'
'				Red%	 --> Rot-Anteil der neuen Farbe (0-15)
'				Green%	 --> Grün-Anteil der neuen Farbe (0-15)
'				Blue%	 --> Blau-Anteil der neuen Farbe (0-15)
'
'				EndFlag% --> - TRUE% , dann endet hier die Farbtabelle
'							 - FALSE%, dann MUSS noch ein weiterer Farbeintrag
'									   (SUB-Aufruf) folgen.
'
' Bemerkung:	Nach Aufruf der Routine für alle einzelnen Farbeinträge finden
'				Sie die fertige Farbtabelle in der Variable »smFarb$«, welche
'				Sie an »ShowMsg()« mittels »SADD(smFarb$)« übergeben müssen.
'
'				Ein Beispiel für die Benutzung dieser Routine finden Sie in der
'				Datei »demo/ShowMsgDemo.BAS«.
'
'   ACHTUNG:	Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
'   ¯¯¯¯¯¯¯¯	dem Namen »smFarb$« verwenden, da diese unweigerlich durch
'				dieses Unterprogramm überschrieben werden würde.
'
'				Außerdem müssen Sie die Farbtabelle immer unmittelbar vor
'				dem »ShowMsg()«-Aufruf definieren, da die Variable »smFarb$«
'				jedesmal wieder überschrieben wird, und daher immer nur die
'				zuletzt erstellte Farbtabelle enthält.
'
' Siehe auch:  »SMTEXTP()«, »SMTEXT()«, »ShowMsg()«
'============================================================================

SUB SMCOLOR(Pen%,Red%,Green%,Blue%,EndFlag%) STATIC
SHARED smFarb$
STATIC lFlag%

	IF lFlag%<>FALSE% THEN	' wird eine neue Farbtabelle angefangen,
		lFlag%=FALSE%		' dann »smFarb$« erst zurücksetzen
		smFarb$=""
	ELSE
		lFlag%=EndFlag%
	END IF

	smFarb$=smFarb$+CHR$(Pen%)+MKI$(Red%*256+Green%*16+Blue%)

	IF EndFlag%=FALSE% THEN		' wenn kein END-Flag, dann Continue-Byte
		smFarb$=smFarb$+CHR$(1)	' setzen, ansonsten 0-Byte
	ELSE
		smFarb$=smFarb$+CHR$(0)
	END IF

END SUB

'*** extra.library / SMTEXTP() ***
'============================================================================
' Diese Routine erstellt einen Teilstring des Parameterstrings der Funktion
' »ShowMsg()« inclusive der gewünschten Einstellungen für die Textausgabe.
' Wahlweise kann der Text automatisch zentriert, oder links- bzw. rechtsbündig
' ausgerichtet werden.
'----------------------------------------------------------------------------
' Definiert:	extra.bc  (Copyright © 1998-2001 RhoSigma, Roland Heyder)
'
' Schablone:	xPos%/A/N, yPos%/A/N, MPen%/A/N, TLPen%/A/N, BRPen%/A/N,
'				Style%/A/N, Mask%/A/N, Text$/A, EndFlag%/K/S
'
' Parameter:	xPos%	 --> x-Position des Textes,
'								oder einer der oben definierten SMTPOS-Werte
'
'				yPos%	 --> y-Position des Textes,
'								Ausrichtung an der Oberkante des Fonts
'
'				MPen%	 --> gewünschter MainPen        \
'				TLPen%	 --> gewünschter TopLeftPen     |
'				BRPen%	 --> gewünschter BottomRightPen | (s. »SpecTextPrefs()«)
'				Style%	 --> gewünschter SoftStyle      |
'				Mask%	 --> gewünschte  Randmaske      /
'
'				Text$	 --> der Text selbst als Variable oder Konstante
'
'				EndFlag% --> - TRUE% , dann endet hier der Parameterstring
'							 - FALSE%, dann MUSS noch ein weiterer Teilstring
'									   (SUB-Aufruf) folgen.
'
' Bemerkung:	Nach Aufruf der Routine für alle einzelnen Teilstrings finden
'				Sie den fertigen Parameterstring in der Variable »smAlert$«,
'				welche Sie an »ShowMsg()« mittels »SADD(smAlert$)« übergeben
'				müssen.
'
'				Diese Routine sollten Sie nur dann verwenden, wenn Sie für
'				diesen Teilstring neue Einstellungen für Farben etc. machen
'				wollen. Wenn dieser Teilstring jedoch mit den gleichen Ein-
'				stellungen ausgegeben werden soll, wie der vorhergehende bzw.
'				Sie die Default-Einstellungen verwenden wollen, dann müssen
'				Sie stattdessen die Routine »SMTEXT()« verwenden.
'
'				Ein Beispiel für die Benutzung dieser Routine finden Sie in
'				der Datei »demo/ShowMsgDemo.BAS«.
'
'   ACHTUNG:	Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
'   ¯¯¯¯¯¯¯¯	dem Namen »smAlert$« verwenden, da diese unweigerlich durch
'				dieses Unterprogramm überschrieben werden würde. Außerdem
'				dürfen Sie auch nicht »smlFlag%« benutzen, da über dieses
'				wichtige Daten zwischen den beiden Routinen »SMTEXTP()« und
'				»SMTEXT()« ausgetauscht werden !!
'
'				Außerdem müssen Sie den Parameterstring immer unmittelbar vor
'				dem »ShowMsg()«-Aufruf definieren, da die Variable »smAlert$«
'				jedesmal wieder überschrieben wird, und daher immer nur den
'				zuletzt erstellten Parameterstring enthält.
'
' Siehe auch:  »SMCOLOR()«, »SMTEXT()«, »ShowMsg()«
'============================================================================

SUB SMTEXTP(xPos%,yPos%,MPen%,TLPen%,BRPen%,Style%,Mask%,Text$,EndFlag%) STATIC
SHARED smAlert$,smlFlag%

	IF smlFlag%<>FALSE% THEN	' wird ein neuer ParamString angefangen,
		smlFlag%=FALSE%			' dann »Alert$« erst zurücksetzen
		smAlert$=""
	ELSE
		smlFlag%=EndFlag%
	END IF

	IF xPos%=SMTPOS_C% THEN				' gewünschte Ausrichtung,
		xPos%=(640-(LEN(Text$)*8))/2	' falls angegeben
	ELSEIF xPos%=SMTPOS_L% THEN
		xPos%=12
	ELSEIF xPos%=SMTPOS_R% THEN
		xPos%=(640-(LEN(Text$)*8))-12
	END IF

	smAlert$=smAlert$+MKI$(xPos%)+CHR$(yPos%)+CHR$(1)+CHR$(MPen%)+CHR$(TLPen%)
	smAlert$=smAlert$+CHR$(BRPen%)+CHR$(Style%)+CHR$(Mask%)+Text$+CHR$(0)

	IF EndFlag%=FALSE% THEN			' wenn kein END-Flag, dann Continue-Byte
		smAlert$=smAlert$+CHR$(1)	' setzen, ansonsten 0-Byte
	ELSE
		smAlert$=smAlert$+CHR$(0)
	END IF

END SUB

'*** extra.library / SMTEXT() ***
'============================================================================
' Diese Routine erstellt einen Teilstring des Parameterstrings der Funktion
' »ShowMsg()«. Wahlweise kann der Text automatisch zentriert, oder links- bzw.
' rechtsbündig ausgerichtet werden.
'----------------------------------------------------------------------------
' Definiert:	extra.bc  (Copyright © 1998-2001 RhoSigma, Roland Heyder)
'
' Schablone:	xPos%/A/N, yPos%/A/N, Text$/A, EndFlag%/K/S
'
' Parameter:	xPos%	 --> x-Position des Textes,
'								oder einer der oben definierten SMTPOS-Werte
'
'				yPos%	 --> y-Position des Textes,
'								Ausrichtung an der Oberkante des Fonts
'
'				Text$	 --> der Text selbst als Variable oder Konstante
'
'				EndFlag% --> - TRUE% , dann endet hier der Parameterstring
'							 - FALSE%, dann MUSS noch ein weiterer Teilstring
'									   (SUB-Aufruf) folgen.
'
' Bemerkung:	Nach Aufruf der Routine für alle einzelnen Teilstrings finden
'				Sie den fertigen Parameterstring in der Variable »smAlert$«,
'				welche Sie an »ShowMsg()« mittels »SADD(smAlert$)« übergeben
'				müssen.
'
'				Dieses Macro sollten Sie nur dann verwenden, wenn Sie für
'				diesen Teilstring die gleichen Einstellungen wie für den vor-
'				hergehenden Teilstring verwenden wollen. Wenn dieser Teil-
'				string jedoch neue Einstellungen für Farben etc. erhalten
'				soll, dann müssen Sie stattdessen das Macro »SMTEXTP()« ver-
'				wenden.
'
'				Ein Beispiel für die Benutzung dieser Routine finden Sie in
'				der Datei »demo/ShowMsgDemo.BAS«.
'
'   ACHTUNG:	Sie dürfen in Ihrem Programm keine eigene Stringvariable mit
'   ¯¯¯¯¯¯¯¯	dem Namen »smAlert$« verwenden, da diese unweigerlich durch
'				dieses Unterprogramm überschrieben werden würde. Außerdem
'				dürfen Sie auch nicht »smlFlag%« benutzen, da über dieses
'				wichtige Daten zwischen den beiden Routinen »SMTEXTP()« und
'				»SMTEXT()« ausgetauscht werden !!
'
'				Außerdem müssen Sie den Parameterstring immer unmittelbar vor
'				dem »ShowMsg()«-Aufruf definieren, da die Variable »smAlert$«
'				jedesmal wieder überschrieben wird, und daher immer nur den
'				zuletzt erstellten Parameterstring enthält.
'
' Siehe auch:  »SMCOLOR()«, »SMTEXTP()«, »ShowMsg()«
'============================================================================

SUB SMTEXT(xPos%,yPos%,Text$,EndFlag%) STATIC
SHARED smAlert$,smlFlag%

	IF smlFlag%<>FALSE% THEN	' wird ein neuer ParamString angefangen,
		smlFlag%=FALSE%			' dann »Alert$« erst zurücksetzen
		smAlert$=""
	ELSE
		smlFlag%=EndFlag%
	END IF

	IF xPos%=SMTPOS_C% THEN				' gewünschte Ausrichtung,
		xPos%=(640-(LEN(Text$)*8))/2	' falls angegeben
	ELSEIF xPos%=SMTPOS_L% THEN
		xPos%=12
	ELSEIF xPos%=SMTPOS_R% THEN
		xPos%=(640-(LEN(Text$)*8))-12
	END IF

	smAlert$=smAlert$+MKI$(xPos%)+CHR$(yPos%)+CHR$(0)+Text$+CHR$(0)

	IF EndFlag%=FALSE% THEN			' wenn kein END-Flag, dann Continue-Byte
		smAlert$=smAlert$+CHR$(1)	' setzen, ansonsten 0-Byte
	ELSE
		smAlert$=smAlert$+CHR$(0)
	END IF

END SUB
