/* ___________________________________________________________________________
** |*************************************************************************|
** |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
** |*| Set TAB to 4 for best readable file layout.  |*|  C++ MaxonDev 4.0  |*|
** |*|______________________________________________|*|____________________|*|
** |*************************************************************************|
** |*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯|*|
** |*|               |*|  $Id: settings.h (18.11.00)                       |*|
** |*| ###### ###### |*|  RhoSigma Source based on NDK 3.1 Includes 40.15  |*|
** |*| ##  ## ##   # |*| _________________________________________________ |*|
** |*| ##  ##  ##    |*|                                                   |*|
** |*| ######   ##   |*|  Useful defines and extensions for NDK includes   |*|
** |*| ##      ##    |*|                                                   |*|
** |*| ##     ##   # |*| ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |*|
** |*| ##     ###### |*|  Copyright © 1998-2000 RhoSigma, Roland Heyder    |*|
** |*|               |*|  All Rights Reserved.                             |*|
** |*|_______________|*|___________________________________________________|*|
** |*************************************************************************|
** ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/

#ifndef	RHOSIGMA_SETTINGS_H
#define	RHOSIGMA_SETTINGS_H

#ifndef		EXEC_TYPES_H
#include	<exec/types.h>
#endif

#include	<stdarg.h>
#include	<string.h>
#include	<stdlib.h>

	/** enhanced booleans **/

#ifndef	UPPER			/* Signum-Werte zur Verwendung in */
#define	UPPER	1L		/* Variablen des Typs BOOL        */
#endif
#ifndef	EQUAL
#define	EQUAL	0L
#endif
#ifndef	LOWER
#define	LOWER	-1L
#endif

	/** intuition **/

#define DATPOS_C -1		/* Text zentrieren   */
#define DATPOS_L -2		/* Text linksbündig  */
#define DATPOS_R -3		/* Text rechtsbündig */

/*** rhosigma / DATEXT() ***
*»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
* Dieses Macro erstellt einen Teilstring des Parameterstrings der Intuition-
* Routine »DisplayAlert()«. Wahlweise kann der Text automatisch zentriert,
* oder links- bzw. rechtsbündig ausgerichtet werden.
*-----------------------------------------------------------------------------
* Definiert:	settings.h  (Copyright © 1998-2000 RhoSigma, Roland Heyder)
*
* Schablone:	Name/A, xPos/A/N, yPos/A/N, String/A, EndFlag/N/S
*
* Parameter:	Name	--> ein deklariertes Element des Typs STRPTR
*
*				xPos	--> x-Position des Textes,
*								oder einer der oben definierten DATPOS-Werte.
*
*				yPos	--> y-Position des Textes,
*								Ausrichtung nach BaseLine des Fonts (topaz/8)
*
*				String	--> der Text selbst als Konstante (z.B. "Test")
*
*				EndFlag	--> - TRUE , dann endet hier der Parameterstring
*							- FALSE, dann MUSS noch ein weiterer Teilstring
*									 (Macro-Aufruf) folgen.
*
* Bemerkung:	Dieses Macro kann NUR innerhalb von Funktion verwendet werden,
*				da es ausführbaren Code generiert, d.h. es ist nicht möglich
*				alle benötigten Parameterstrings gleich am Programmanfang auf
*				Dateiebene global zu deklarieren.
*
*				Leider kann man sich bei C/C++ auch nicht darauf verlassen, daß
*				direkt nacheinander deklarierte konstante Zeichenketten im fer-
*				tigen Programmcode dann auch noch direkt hintereinander im
*				Speicher liegen. Aus diesem Grunde ist es in C/C++ erforder-
*				lich, die einzelnen Strings vor der Benutzung noch mittels der
*				ebenfalls hier definierten Funktion »DAJOIN()« zusammenzufügen.
*
*				Ein Beispiel für die Benutzung dieses Macros finden Sie in
*				der Datei »demo/AlertDemo.CPP«.
*
* Siehe auch:	»DAJOIN()«, »DAFREE()«
*«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««*/

#define DATEXT(Name, xPos, yPos, String, EndFlag)	\
						Name	= "   "#String"  ";	\
						Name[0] = ((xPos)>>8);		\
						Name[1] = ((xPos)&255);		\
						Name[2] = (yPos);			\
		Name[sizeof(#String)+2] = 0;				\
		Name[sizeof(#String)+3] = (!EndFlag)

/*** rhosigma / DAJOIN() ***
*»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
* Diese Funktion dient zum Zusammenfügen der, zuvor mittels »DATEXT()« initia-
* lisierten, Teilstrings zum fertigen Parameterstring. Idealer Weise sollte man
* diese Funktion unmittelbar vor dem »DisplayAlert()«-Aufruf, in dem man den
* Parameterstring verwenden will, aufrufen.
*-----------------------------------------------------------------------------
* Synopsis:		Param = DAJOIN (Count, ...)
*
* Eingaben:		Count	-->	(UWORD)  Anzahl der zusammenzufügenden Teilstrings
*
*				...		--> (STRPTR) nacheinander in der richtigen Reihenfolge
*									 die Zeiger der einzelnen Teilstrings
*
* Ergebnis:		Param	--> (STRPTR) Zeiger auf den komplett generierten Para-
*									 meterstring, der direkt an »DisplayAlert()«
*									 übergeben werden kann, bzw. NULL, wenn
*									 nicht mehr genügend Speicher frei ist.
*
* Bemerkung:	Der Parameterstring wird erstellt, indem alle Teilstrings
*				nacheinander in einen neuen zusammenhängenden Speicherblock
*				kopiert werden. Dieser Speicherblock sollte, wenn der Para-
*				meterstring nicht mehr benötigt wird, spätestens jedoch vor
*				Programmende, wieder freigegeben werden. Bitte benutzen Sie
*				dazu das ebenfalls hier definierte Macro »DAFREE()«.
*
*				Ein Beispiel für die Benutzung dieser Funktion finden Sie in
*				der Datei »demo/AlertDemo.CPP«.
*
*   ACHTUNG:	Diese Funktion muß auch dann aufgerufen werden, wenn nur ein
*	¯¯¯¯¯¯¯¯	einziger Teilstring benutzt wird, da das Macro »DATEXT()«
*				keine vollständige Initialisierung des gleichen vornimmt. Das
*				wird alles erst durch »DAJOIN()« erledigt !!
*
* Siehe auch:	»DATEXT()«, »DAFREE()«
*«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««*/

STRPTR DAJOIN(UWORD Count, ...)
{
	BOOL    SpcFlag;
	STRPTR  TxtPtr, MemPtr;
	UWORD   TxtLen, MemNeed=NULL, MemPos=NULL, ArgCnt, LenCnt;
	va_list ArgPtr;

	va_start(ArgPtr, Count);
	for (ArgCnt=NULL; ArgCnt<Count; ArgCnt++)
	{
		TxtPtr = va_arg(ArgPtr, STRPTR);
		TxtLen = strlen(TxtPtr+3);
		if (TxtLen & 1) MemNeed += TxtLen+5;
		else            MemNeed += TxtLen+1+5;
	}

	MemPtr = (STRPTR) malloc(MemNeed);
	if (!MemPtr)      return NULL;

	va_start(ArgPtr, Count);
	for (ArgCnt=NULL; ArgCnt<Count; ArgCnt++)
	{
		TxtPtr = va_arg(ArgPtr, STRPTR);
		TxtLen = strlen(TxtPtr+3);
		if (TxtLen & 1) SpcFlag=FALSE;
		else            SpcFlag=TRUE;

		if ((UBYTE) TxtPtr[0] == 0xff)
		{
			if ((UBYTE) TxtPtr[1] == 0xff) LenCnt = (640-(TxtLen*8))/2;
			if ((UBYTE) TxtPtr[1] == 0xfe) LenCnt = 12;
			if ((UBYTE) TxtPtr[1] == 0xfd) LenCnt = (640-(TxtLen*8))-12;
			TxtPtr[0] = (LenCnt)>>8;
			TxtPtr[1] = (LenCnt)&255;
		}
		TxtLen += 3;

		for (LenCnt=NULL; LenCnt<TxtLen; LenCnt++)
		{
			MemPtr[MemPos+LenCnt] = TxtPtr[LenCnt];
		}
		if (!SpcFlag)
		{
			TxtLen += 2;
			MemPtr[MemPos+LenCnt]   = TxtPtr[LenCnt];
			MemPtr[MemPos+LenCnt+1] = TxtPtr[LenCnt+1];
		}
		else
		{
			TxtLen += 1+2;
			MemPtr[MemPos+LenCnt]   = ' ';
			MemPtr[MemPos+LenCnt+1] = TxtPtr[LenCnt];
			MemPtr[MemPos+LenCnt+2] = TxtPtr[LenCnt+1];
		}
		MemPos += TxtLen;
	}
	return MemPtr;
}

/*** rhosigma / DAFREE() ***
*»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
* Dieses Macro dient zur Freigabe des Speichers eines mittels »DAJOIN()« gene-
* rierten Parameterstrings. Die Teilstrings selbst, welche mittels des Macros
* »DATEXT()« deklariert wurden, bleiben jedoch erhalten, d.h. Sie können sich
* den Parameterstring jeder Zeit mit »DAJOIN()« neu generieren lassen.
*-----------------------------------------------------------------------------
* Definiert:	settings.h  (Copyright © 1998-2000 RhoSigma, Roland Heyder)
*
* Schablone:	Address/A
*
* Parameter:	Address	-->	der STRPTR, den Sie von »DAJOIN()« als Ergebnis
*							erhalten haben
*
* Bemerkung:	Ein Beispiel für die Benutzung dieses Macros finden Sie in
*				der Datei »demo/AlertDemo.CPP«.
*
* Siehe auch:	»DATEXT()«, »DAJOIN()«
*«««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««*/

#define DAFREE(Address) free((APTR) Address)

#endif	/* RHOSIGMA_SETTINGS_H */

