Laufzeit-Eingabe und Zonenzustand korrigieren und Change archivieren

This commit is contained in:
2026-09-06 08:04:22 +02:00
parent 815825dde7
commit c8b92f0619
36 changed files with 1104 additions and 91 deletions

View File

@@ -58,6 +58,7 @@ Bildschirm zurück.
| `TIMER` | Funktion |
| `TIMESERIAL` | Funktion |
| `TIMEVALUE` | Funktion |
| `TIMEZONEKNOWN` | Funktion |
| `WEEKDAY` | Funktion |
| `YEAR` | Funktion |
@@ -72,6 +73,13 @@ Zeitpunkt bestimmt, nicht einmal beim Programmstart — ein Programm, das
Lässt sich die Zone nicht ermitteln, gilt UTC; das Programm läuft weiter
und der Runner meldet es einmal beim Start auf der Fehlerausgabe.
`TIMEZONEKNOWN` ist eine parameterlose TerminalBasic-Erweiterung mit
Ergebnistyp `INTEGER`: `-1` bei ermittelter Zone (auch UTC), `0` bei
UTC-Rückfall. Jede Abfrage ermittelt den aktuellen Zustand, einschließlich
späterer Ausfälle und Wiederherstellung. Sie ändert weder die Systemuhr
noch den programmeigenen Versatz. Rust-Einbetter erhalten Zeitwert und
Status gemeinsam über `RtState::zeitpunkt()`; `Zeitzone::Unbekannt` kann
weiterhin einen festen UTC-Rückfall vorgeben.
`DATE$ = …` und `TIME$ = …` stellen nicht die Systemuhr, sondern einen
programmeigenen Versatz auf die Ortszeit, den alle Zeitfunktionen
@@ -384,9 +392,39 @@ einen dokumentierten Ersatzwert statt still zu variieren.
`INKEY$` blockiert nicht: leerer String bei leerem Puffer, ein Zeichen
bei einer Zeichentaste, zwei Zeichen mit führendem Nullzeichen bei
einer Sondertaste. `INPUT$(n)` liest genau `n` Zeichen und blockiert
einer Sondertaste. `INPUT$(n)` liest genau `n` Unicode-Codepoints und blockiert
dabei, ohne sie am Bildschirm zu wiederholen.
`KEY n, text$` belegt ein Funktionstasten-Makro (n = 110 sowie 30/31,
höchstens 15 Zeichen), `KEY LIST` gibt alle zwölf untereinander aus,
`KEY ON`/`KEY OFF` blendet die Softkey-Zeile ein und aus.
## Fortlaufende Datei-Eingabe und Record-Konvertierung
`INPUT #` liest Felder fortlaufend, auch über Zeilengrenzen hinweg. Nicht
benötigte Felder bleiben für spätere Aufrufe erhalten. `WRITE #` setzt
Strings in Anführungszeichen und verdoppelt enthaltene Anführungszeichen;
`INPUT #` erhält deren Inhalt einschließlich Kommas und Leerraum.
Fehlende geforderte Felder lösen Fehler 62 aus; ein ausdrücklich leeres
Feld bleibt zulässig.
`INPUT$(n, #f)` decodiert genau `n` UTF-8-Codepoints aus einer INPUT- oder
BINARY-Datei. `INPUT #`, `LINE INPUT #` und `INPUT$` verwenden dieselbe
Leseposition; `LINE INPUT #` entfernt ein LF-, CR- oder CRLF-Zeilenende.
`SEEK` und `LOC` beziehen sich dabei weiterhin auf Bytes. `INPUT$(0)`
verbraucht nichts; negative Längen lösen Fehler 5 aus. EOF vor dem
geforderten Zeichen führt zu Fehler 62; ungültige oder abgeschnittene
UTF-8-Sequenzen führen zu Fehler 57 statt zu Ersatzzeichen.
Bei Tastatureingabe bleibt der unbenutzte Rest einer erweiterten Taste
für `INPUT$` bzw. `INKEY$` erhalten: zweimal `INPUT$(1)` liest aus F1
zuerst `CHR$(0)`, dann `CHR$(59)`.
`CVI`, `CVL`, `CVS`, `CVD`, `CVC` verlangen exakt 2, 4, 4, 8 bzw. 8
Bytezeichen (Codepoints 0255), entsprechend `MKI$`, `MKL$`, `MKS$`,
`MKD$`, `MKC$`. Kürzere, längere oder nicht als Byte darstellbare
Argumente lösen Fehler 5 aus. GET/PUT und UTF-32-Recordfelder bleiben
unverändert; die MK/CV-Bytezeichen sind keine UTF-8-Dateidecodierung.
Fehlt bei `OPEN FOR INPUT`, `KILL` oder der Quelle von `NAME` nur die
Datei, gilt Fehler 53. Ein fehlender Elternpfad führt zu Fehler 76,
auch beim Erzeugen, Umbenennen oder Anlegen von Verzeichnissen.

View File

@@ -22,7 +22,7 @@ namentlich abgewiesen. `Non-Feature` = abgelehnt, gelistet unter
**Fundstelle.** Bei `implementiert` das Modul, bei `Non-Feature` der
Abschnitt der Sprachreferenz, bei `offen` ein Strich.
**Abdeckung.** implementiert 794 · offen 0 · Non-Feature 50 · gesamt 844
**Abdeckung.** implementiert 795 · offen 0 · Non-Feature 50 · gesamt 845
| Name | Art | Gruppe | Status | Fundstelle | Quelle |
|---|---|---|---|---|---|
@@ -99,6 +99,7 @@ Abschnitt der Sprachreferenz, bei `offen` ein Strich.
| `MINUTE` | Funktion | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |
| `MONTH` | Funktion | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |
| `NOW` | Funktion | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |
| `TIMEZONEKNOWN` | Funktion | Datum/Zeit | implementiert | tb-runtime::builtins | TerminalBasic-Erweiterung |
| `SECOND` | Funktion | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |
| `TIME$` | Anweisung | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |
| `TIME$` | Funktion | Datum/Zeit | implementiert | tb-runtime::datetime | bas7advr |

View File

@@ -46,6 +46,19 @@ archiviert. Details und
Szenariozuordnung: [Implementierungsnachweis](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/verification.md).
Die folgenden Befundtexte bleiben die historische Bestandsaufnahme.
## Umsetzungsstand: Laufzeit-Eingabe und Systemstatus
F14, F15, F16, F17 und F19 sind im archivierten Change
[laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md)
umgesetzt. Der Abschlussabgleich hat keine offenen Befunde im Change:
463 Workspace-Tests, Clippy, Format- und Spec-Prüfung bestehen. Alle sechs
Tasks sind abgeschlossen; die bestehenden Sollausgaben bleiben unverändert.
Szenarien und Randfälle stehen im
[Implementierungsnachweis](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/verification.md).
Die vier Hauptspecs wurden am 06.09.2026 synchronisiert, alle 15 Hauptspecs
streng validiert und der Change archiviert. Die Befundtexte unten bleiben
die historische Bestandsaufnahme.
## Prüfmethode und Grenzen
- Alle Requirements/Szenarien gelesen und gegen Einstiegspunkte, Implementierung und vorhandene Tests abgeglichen. Die Matrix unten enthält jeden Requirement-Titel einmal.
@@ -168,7 +181,7 @@ Nach WRITE #1, "a", "b" liest INPUT #1, a$ die ganze Zeile und verwirft b; das z
Beleg: [crates/tb-vm/src/interp.rs:2529](../../crates/tb-vm/src/interp.rs#L2529). Vertrag: [openspec/specs/datei-eio/spec.md:35](../../openspec/specs/datei-eio/spec.md#L35).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md).
### F15 — INPUT$ zählt weder durchgehend Zeichen noch die verlangte Länge (mittel)
@@ -176,7 +189,7 @@ INPUT$(1) mit F1 liefert zwei Zeichen (Nullzeichen und Scancode). INPUT$(1,#1) a
Beleg: [crates/tb-runtime/src/builtins.rs:2116](../../crates/tb-runtime/src/builtins.rs#L2116). Vertrag: [openspec/specs/textbildschirm/spec.md:144](../../openspec/specs/textbildschirm/spec.md#L144).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md).
### F16 — CV-Funktionen akzeptieren zu lange Byte-Strings (mittel)
@@ -184,7 +197,7 @@ CVI("abc") läuft erfolgreich und liefert 25185. Die Implementierung prüft nur
Beleg: [crates/tb-runtime/src/builtins.rs:1640](../../crates/tb-runtime/src/builtins.rs#L1640). Vertrag: [openspec/specs/datei-eio/spec.md:68](../../openspec/specs/datei-eio/spec.md#L68).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md).
### F17 — Fehlender Elternpfad wird als fehlende Datei gemeldet (mittel)
@@ -192,7 +205,7 @@ OPEN "absentdir/file.txt" FOR INPUT liefert Fehler 53; der Vertrag unterscheidet
Beleg: [crates/tb-runtime/src/fileio.rs:69](../../crates/tb-runtime/src/fileio.rs#L69). Vertrag: [openspec/specs/datei-eio/spec.md:135](../../openspec/specs/datei-eio/spec.md#L135).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md).
### F18 — Umschalt-Tab wird am Terminal verworfen (mittel)
@@ -208,7 +221,7 @@ Zeitzone::Unbekannt ist auf Rust-Ebene vorhanden und der CLI-Runner schreibt ein
Beleg: [crates/tb-runtime/src/datetime.rs:147](../../crates/tb-runtime/src/datetime.rs#L147). Vertrag: [openspec/specs/konsolen-basisbibliothek/spec.md:260](../../openspec/specs/konsolen-basisbibliothek/spec.md#L260).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md).
Umsetzung: [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md).
### F20 — VM hängt transitiv von Terminalbibliotheken ab (mittel)
@@ -266,7 +279,7 @@ Umsetzung: [spezifikationsabgleich-und-regressionsnachweise](../../openspec/chan
| 2 | [ereigniszustellung-und-hostgrenzen](../../openspec/changes/archive/2026-09-05-ereigniszustellung-und-hostgrenzen/proposal.md) | F04, F05, F06, F07, F08, F18, F20 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
| 3 | [forms-zustand-und-bedienung](../../openspec/changes/archive/2026-09-05-forms-zustand-und-bedienung/proposal.md) | F12, F13 | Nach Ereigniszustellung |
| 4 | [projektmodule-und-kompilat](../../openspec/changes/archive/2026-09-05-projektmodule-und-kompilat/proposal.md) | F09, F10, F11, F24 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
| 5 | [laufzeit-eingabe-und-systemstatus](../../openspec/changes/laufzeit-eingabe-und-systemstatus/proposal.md) | F14, F15, F16, F17, F19 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
| 5 | [laufzeit-eingabe-und-systemstatus](../../openspec/changes/archive/2026-09-06-laufzeit-eingabe-und-systemstatus/proposal.md) | F14, F15, F16, F17, F19 | Eigenständig; bei gemeinsamen Dateien sequenziell integrieren |
| 6 | [spezifikationsabgleich-und-regressionsnachweise](../../openspec/changes/spezifikationsabgleich-und-regressionsnachweise/proposal.md) | F21, F22, F23, F25 | Abschließende Gesamtabnahme nach den fünf Korrektur-Changes |
## Vollständige Requirement-Matrix

View File

@@ -277,7 +277,9 @@ verweist dazu auf ein nicht vorliegendes Kapitel des Programmer's Guide):
`LINE INPUT` (ganze Zeile in String).
- `INKEY$` (nicht blockierend; "" wenn leer; erweiterte Tasten:
2-Zeichen-Sequenz `CHR$(0)+code` im Vorbild — Abweichung s. u.),
`INPUT$(n [,#f])`.
`INPUT$(n [,#f])` liest genau `n` Unicode-Codepoints, ohne Echo. Der
Rest einer Sondertastenfolge bleibt lesbar. Dateien werden als UTF-8
decodiert; zu wenige Zeichen → Fehler 62, beschädigtes UTF-8 → Fehler 57.
- `LOCATE [zeile][,spalte][,cursor an/aus][,start,ende]`, `CSRLIN`, `POS(0)`
— arbeiten auf der tatsächlichen Bildschirmgröße (dynamisch, s. Abweichungen).
- `COLOR [vg][,hg]` (vg 031: 1631 = blinkend — bei uns als „hell"
@@ -310,14 +312,21 @@ verweist dazu auf ein nicht vorliegendes Kapitel des Programmer's Guide):
`BINARY`.
- `CLOSE [#n, …]`, `RESET` (alle schließen).
- Sequenziell: `PRINT #`, `PRINT # USING`, `WRITE #` (CSV-artig, Strings in
`"…"`), `INPUT #`, `LINE INPUT #`, `EOF(n)`.
`"…"`, innere Anführungszeichen verdoppelt), `INPUT #`, `LINE INPUT #`,
`EOF(n)`. `INPUT #` bewahrt übrige Felder und liest über Zeilen hinweg;
fehlende geforderte Felder lösen Fehler 62 aus. Die drei Datei-Lesearten
`INPUT #`, `LINE INPUT #`, `INPUT$` teilen einen Cursor.
- Random: `FIELD #n, breite AS var$…` (klassisch) **und** `GET/PUT #n
[,satznr] [,var]` mit TYPE-Variablen; `LSET`/`RSET` für Feldpuffer.
- Binary: `GET/PUT #n, [pos], var`, `SEEK #n, pos` / `SEEK(n)`,
`LOC(n)`, `LOF(n)`.
- Verwaltung: `NAME alt$ AS neu$`, `KILL datei$`, `FILES [muster$]`,
`CHDIR`, `MKDIR`, `RMDIR`, `FILEATTR`, `FREEFILE`.
- Pfade: plattformneutral; `/` und `\` werden akzeptiert.
- Pfade: plattformneutral; `/` und `\` werden akzeptiert. Fehlende Datei
bei vorhandenem Elternverzeichnis → Fehler 53; fehlender Elternpfad → 76.
- `CVI/CVL/CVS/CVD/CVC` verlangen exakt 2/4/4/8/8 Bytezeichen mit
Codepoints 0255, sonst Fehler 5. Die zugehörigen `MK…$`-Funktionen
liefern diese Darstellung; Recordfelder bleiben UTF-32.
## 10a. ISAM (indizierter Satzzugriff)
@@ -547,7 +556,11 @@ Dialoge:
Programm, das über eine Zeitumstellung hinweg läuft, folgt ihr.
Lässt sich die Zone des Rechners nicht ermitteln, gilt UTC; das
Programm läuft weiter, und der Runner meldet es einmal beim Start auf
der Fehlerausgabe („Zeitzone nicht ermittelbar …"). `DATE$ = …` und
der Fehlerausgabe („Zeitzone nicht ermittelbar …"). Die additive
TerminalBasic-Erweiterung `TIMEZONEKNOWN` (ohne Argument, `INTEGER`)
liefert `-1` für eine ermittelte Zone, `0` für UTC-Rückfall. Der Status
folgt jeder aktuellen Ermittlung, auch späterem Ausfall und Erholung;
eine ermittelte UTC-Zone liefert ebenfalls `-1`. `DATE$ = …` und
`TIME$ = …` stellen nicht die Systemuhr, sondern einen programmeigenen
Versatz auf die Ortszeit; alle Zeitfunktionen rechnen ihn mit ein.
6b. **Serielle Datumswerte** zählen Tage ab dem 30.12.1899 (Serie 2 =