'****************************************************************************
'*                                                                          *
'*  GarbageCollection-sichere Stringkommunikation mit dem Betriebssystem    *
'*  für MaxonBASIC 3 / HiSoftBASIC 2 und Commodore-Includes 37+             *
'*  © by Steffen Leistner 1992-94,96                                        *
'*  basics.bh benötigt Funktionen der Exec.Library. Daher muß diese vorher  *
'*  includet werden. Die Freigabe des von ExtStr& allozierten Stringspei-   *
'*  chers muß mit der Exec-Routine FreeVec& erfolgen. Ist nicht mehr genü-  *
'*  gend Speicher für den String vorhanden, liefert ExtStr& als Adresse     *
'*  NULL& zurück.                                                           *
'*                                                                          *
'****************************************************************************

' 1. String an fester Speicherstelle plazieren

FUNCTION ExtStr& (txt.$)
	LOCAL txt$, tlen&, newaddr&
	txt$ = txt.$
	ExtStr& = NULL&
	IF txt$ <> "" THEN
		IF RIGHT$(txt$,1) <> CHR$(0) THEN
			txt$ = txt$ + CHR$(0)
		END IF
		tlen& = LEN(txt$)
		newaddr& = xAllocVec& (tlen&, MEMF_PUBLIC&)
		IF newaddr& > 0 THEN
			CopyMem SADD(txt$), newaddr&, tlen&
			ExtStr& = newaddr&
		END IF
	END IF
END FUNCTION

' 2. String in vorhandenen Puffer schreiben
' ACHTUNG: Puffergröße wird nicht überprüft!

SUB PokeStrB (paddr.&, txt.$)
	LOCAL tpos&, tlen&
	tpos& = paddr.&
	WHILE PEEKB(tpos&) <> NULL&
		POKEB tpos&, 0%
		INCR tpos&
	WEND
	tlen& = LEN(txt.$)
	IF tlen& > NULL& THEN
			CopyMem SADD(txt.$), paddr.&, tlen&
	END IF
END SUB

' 3. String mit definierter Länge aus einem Puffer lesen
' (PEEK$ liest bis zu einem CHR$(0), das geht nicht überall)

FUNCTION PeekB$ (saddr.&, maxchrs.&)
	LOCAL temp$
	IF maxchrs.& <= 0 THEN
		PeekB$ = ""
		EXIT FUNCTION
	END IF
	temp$ = SPACE$(maxchrs.&)
	CopyMem saddr.&, SADD(temp$), maxchrs.&
	IF RIGHT$(temp$,1) = CHR$(0) THEN
		PeekB$ = LEFT$(temp$,(LEN(temp$)-1))
	ELSE
		PeekB$ = temp$
	END IF
	temp$ = ""
END FUNCTION
