Laufzeit-Eingabe und Zonenzustand korrigieren und Change archivieren
This commit is contained in:
@@ -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 = 1–10 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 0–255), 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.
|
||||
|
||||
@@ -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 |
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 0–31: 16–31 = 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 0–255, 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 =
|
||||
|
||||
Reference in New Issue
Block a user