SuperBASIC-Erweiterung GETLINE$()

Warnung: Dieses Programm läft zur Zeit nur unter dem Sinclair QL Emulator QPC2 für Windows, bzw. evtl. auch auf anderen SMS/SMSQ-Systemen. Ich habe es jetzt mal mit dem Windows Subsystem für Linux (WSL - danke Microsoft!) unter dem UNIX-/Linux-Emulator uQLx mit Minerva 1.98 getestet. Crasht fürchterlich, nicht mal mehr der Sysmon fängt das "jaulen" an.

Syntax

string$=GETLINE$([#ch] | [#ch,][maxlen[,lf]])

#ch:
SuperBASIC Kanal-Nummer. Voreinstellung: #1
maxlen:
Maximale Länge des zurückgegebenen Strings (130 bis 32766).Falls der Wert außerhalb dieses Bereichs liegt, wird er automatisch erhöht bzw. erniedrigt. (Achtung Werte größer als 32767 führen zum Abbruch mit Fehler "Error in Expression"). Voreinstellung: 258
lf:
Falls lf gleich 0 wird das Zeilenendezeichen abgeschnitten und nicht zurückgegeben. Voreinstellung: 0

string$:
Zurückgegebene Zeichenkette (String) mit Länge zwischen 0 bis maxlen.

Sollte das letzte Zeichen der "Datei" ein Zeilenendezeichen (LF) sein, wird es immer zurückgegeben (sonst hat der Benutzer keine Chance zu erkennen, ob das letzte Zeichen ein LF war oder nicht). Sollte eine Zeile länger sein als maxlen, werden nur die ersten maxlen Zeichen zurückgegeben und die restlichen Zeichen durch einen weiteren Aufruf von GETLINE$(). Dies ist problematisch, falls lf gleich 0 ist (man kann nicht feststellen, ob am Ende ein LF-Zeichen auftrat). Daher sollte man lf=0 nur bei Textdateien oder Konsol-Kanälen ("Fenstern") verwenden, nicht bei binären.

Verwendung

GETLINE$() ist eine Maschinensprachenerweiterung für das im QL eingebaute SuperBASIC und muss, bevor sie verwendet werden kann, einmalig initialisiert werden. Falls (wie im QPC2-Emulator) SuperToolkit II installiert ist, geht das mit:

LRESPR getline_bin

Sonst mit:

address=RESPR(616): LBYTES getline_bin,address: CALL address

Auf echten QLs funktioniert das nur, falls kein ausführbares Programm (außer dem immer laufenden SuperBASIC-Interpreter) läuft. Am besten initialisiert man solche Erweiterungen (Toolkits) daher in seinem Boot-Programm. Unter älteren QDOS-Versionen (bis JM) muss nach der Initialisierung noch NEW eingegeben werden, damit der Interpreter die Erweiterung erkennt (geladenen Erweiterungen können nicht im Programm verwendet werden, in dem sie initialisiert werden).

GETLINE$() liest von der aktuellen Dateiposition bis einschließlich des nächsten Zeilenendezeichens und gibt dies als Zeichenkette als Ergebnis zurück, wobei das Zeilenendezeichen abgeschnitten wird falls der Parameter lf 0 (bzw. nicht angegeben) ist. Im Gegensatz zu z. B. dem INPUT-Befehl von SuperBASIC bricht GETLINE$() nicht mit der Fehlermeldung "End of file" ab, falls das letzte Zeichen einer Datei kein Zeilenendezeichen ist (aber siehe unten).

Vor dem Aufruf muss immer auf EOF() getestet werden. Sollte der Filepointer des Kanals bereits am Ende der Datei stehen, und GETLINE$() wird aufgerufen, bricht SuperBASIC/SBASIC mit der Fehlermeldung "End of File" ab. Falls lf mit einem Wert gleich 0 übergeben wurde (weggelassen wurde), sollte nach dem Aufruf auf EOF() getestet werden. Falls EOF() <> 0, muss getestet werden, ob letztes Zeichen ein Zeilenendezeichen (LF) ist, und wie gegebenenfalls damit verfahren werden soll.

Es wird dringend empfohlen für den Parameter maxlen keine Werte kleiner 0 oder größer 32766 zu verwenden. Bei eventuellen späteren Versionen, kann dies zu unerwartetem Verhalten oder Fehlern führen

Das ZIP-Archiv sollte man auf einem QDOS-System entpacken, da QL-Dateien Fileheader haben, die beim Entpacken auf anderen Systemen verloren gehen. Hier nicht ganz so wichtig, da keine ausführbare Datei enthalten ist.

getline.zip als ZIP-Archiv für QDOS / SMSQ/E
(54 mal heruntergeladen)

Quelltext ist im Archiv enthalten. Das Programm wird unter der GNU General Public License Version 1 oder neuer veröffentlicht, d. h. wenn Sie Änderungen an dem Programm vornehmen und es veröffentlichen, müssen sie es unter der GPL Version 1 oder neuer veröffentlichen. Ausnahme: Falls Sie GETLINE$() in ein anderes, kostenlos verfügbares Toolkit für QDOS oder einem kompatiblen System hinzufügen wollen, so dürfen Sie es dort einfügen und müssen die Lizenz unter der dieses Toolkit steht nicht ändern. Siehe http://www.gnu.org/licenses/gpl-1.0.html, http://www.gnu.org/licenses/gpl-2.0.html oder http://www.gnu.org/licenses/gpl-3.0.html).


Auf der englischsprachigen Seite dieser Sinclair-Download-Seite, gibt es ein weiteres Programm: Ein UNIX-ähnliches ls-Kommando als ausführbares QDOS-Programm (bzw. QDOS-kompatiblem Betriebssystem), das Verzeichnisse ausgibt.

Aufruf z. B: mit:

ex ls,#1;"-l WIN1_"

Gibt das Inhaltsverzeichnis (alle Dateien/Verzeichnisse) der ersten Harddisk ("Winchester") ihres Systems im SuperBASIC-Kanal #1 detailiert aus (mit Datumsangaben, Dateityp, usw.).

Außerdem finden Sie auf der englischsprachigen Seite eine Erweiterung der EDLINE$(#ch,maxlen%,edit$)-Funktion aus dem DIY Toolkit.