home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
doc
/
textio.doc
< prev
Wrap
Text File
|
1992-02-22
|
16KB
|
404 lines
─────────────────────────────────────────────────────────────────────────────
Dokumentation zur Datei: TEXTIO.INC
─────────────────────────────────────────────────────────────────────────────
TEXTIO.INC - Routinen zur sequentiellen gepufferten Bearbeitung
von Textdateien
(für den Assembler A86)
(c) Bernd Schemmer 1990 - 1992
Letzter Update: 22.02.1992
■ Beschreibung:
---------------
Die Routinen ermöglichen einem Programm die gepufferte Bearbeitung
von sequentiellen (Text-)Dateien.
Alle Routinen erwarten in DS:BX einen Zeiger auf eine Datei-Tabelle
mit folgendem Aufbau:
Offset | Länge | Inhalt (alle Worte im INTEL-Format!)
-------+---------+--------------------------------------------
0 | 1 Wort | Datei-Handle
┌─────> 2 | 1 Wort | Puffer-Größe in Byte
│ | | (max. 0FFF0h = 65.520 dez. Bytes)
│ 4 | 1 Wort | Puffer-Zeiger
│ 6 | 1 Wort | Puffer-Ende
│ ┌──> 8 | 1 Wort | Offset des Puffers für die Dateibearbeitung
│ ├─> 10 | 1 Wort | Segment des Puffers für die Dateibearbeitung
│ │ ┌─>12 | 1 Byte | Datei-Status (-1 = geschlossen, 0 = lesen,
│ │ │ | | 1 = schreiben)
│ │ │ 13 | 1 Byte | Länge des Dateinamens (ohne NULL-Byte!) <───┐
│ │ │ 14 | 65 Byte | Dateinamen incl. Pfad als String <──────┤
│ │ │ │
│ │ │ │
│ │ │ Folgende Felder müssen initialisiert werden: │
│ │ └───── Das Feld Datei-Status muß auf 0FFh (= -1) gesetzt werden. │
│ └─────── Das Feld für den Puffer-Offset, das Puffer-Segment, die │
└────────── Puffer-Größe und die Felder für den Dateinamen müssen ────┘
ebenfalls besetzt werden. Falls für die Größe des Puffers
ein Wert größer als 0FFF0h Bytes angegeben wird, wird
der Wert von den Routinen auf 0FFF0h gesetzt.
Alle anderen Felder dürfen nicht initialisiert werden.
Nach der Eröffnung einer Datei darf kein Feld der Struktur
mehr verändert werden.
Hinweis: Die Tabelle kann hinter dem Dateinamen beliebig um private
Felder erweitert werden (z.B. um ein Feld für den Modus der
Datei oder das Attribut der Datei).
Die Länge des Feldes für den Dateinamen kann auf die reale
Länge des Dateinamens plus 1 beschränkt werden.
■ Variablen:
------------
UseControlZ
Byte, falls diese Variable ungleich Null ist, arbeiten die
Routinen mit CTRL-Z als Dateiendezeichen. Steht die Variable
auf Null, so wird CTRL-Z nicht als Dateiendezeichen inter-
pretiert. Die Variable UseControlZ gilt jeweils GLOBAL für
alle über diese Routinen bearbeiteteten Dateien.
Sollen Dateien mit CTRL-Z-Markierung und ohne Markierung
gemischt verwendet werden, so muß zwischen den einzelnen
Dateioperationen jeweils der Inhalt von UseControlZ angepaßt
werden. Voreinstellung für UseControlZ ist 0FFh, d.h.
berücksichtige CTRL-Z.
FileMode
Byte, diese Variable enthält den Modus, der zum Öffnen einer
Datei verwendet wird (wobei nur die Bits 4 bis 7 berücksichtigt
werden). Voreinstellung für den FileModus ist 0; der Inhalt der
Variable ist nur bei der Eröffnung einer Datei von Bedeutung.
(RESET..., REWRITE... und APPEND..., Aufbau: siehe unten)
CreateFileAttr
Wort, Attribute für eine neu zu erstellende Datei (nur für
die Routinen CREATE... von Bedeutung) Voreinstellung für
das Attribut ist 0. Folgende Bits werden von den Routinen
ignoriert: Bit 3 (08h, Volume-Bit)
Bit 4 (10h, Directory-Bit)
und
Bit 6 und 7 (40h und 80h, reservierte Bits)
Hinweis:
Das Attribut READ-ONLY ist erst bei einer weiteren Bearbeitung
der Datei wirksam. D.h. es kann durchaus eine Datei mit dem
Attribut READ-ONLY erstellt werden in die dann normal
geschrieben werden kann. Erst nach dem die Datei mindestens
einmal geschlossen wurde, ist das Attribut READ-ONLY wirksam.
■ Routinen:
-----------
Hinweis: Alle Dateien, die zum Schreiben auf sind MÜSSEN vor dem
Programmende explizit über 'CloseFileBuffered' geschlossen
werden oder die Routine 'FlushFileBuffered' muß zum Leeren
des Puffers aufrufen werden, damit die Puffer in die Datei
geschrieben werden.
Auch bei Auftritt eines Lese- oder Schreibfehler sollten
die Dateien noch geschlossen werden! Sonst erhält man über
kurz oder lang den Fehler 'Kein freies Handle mehr'.
CreateFileBuffered - Erstellt eine Datei (eine bestehende Datei
wird überschrieben)
CreateNewFileBuffered - Erstellt eine neue Datei (eine bestehende
Datei führt zu einem Fehler)
RewriteFileBuffered - Öffnet eine Datei zum Schreiben
ResetFileBuffered - Öffnet eine Datei zum Lesen
AppendFileBuffered - Öffnet eine Datei zum Verlängern
WriteFileBuffered - Schreibt in eine Datei
WritelnFileBuffered - Schreibt in eine Datei (mit CR/LF)
ReadlnFileBuffered - Liest aus einer Datei (bis zum nächsten CR/LF)
ReadFileBuffered - Liest aus einer Datei (#n Zeichen)
FlushFileBuffer - Schreibt den (internen) Puffer
CloseFileBufferd - Schließt eine Datei
■ Definition der Datei-Tabelle
Dateitabelle STRUC [BX]
_Handle dw ? ; Handle der Datei
_Groesse dw ? ; Größe des Puffers
_Zeiger dw ? ; Puffer-Zeiger
_Ende dw ? ; Puffer-Ende
_Offset dw ? ; Offset des Puffers
_Segment dw ? ; Segment des Puffers
_status db ? ; Status der Datei
_Name db ? ; Name der Datei (als String)
db 041h dup ?
ENDS
■ Bedeutung des Datei-Status-Feldes
GESCHLOSSEN EQU 0FFh
LESEN EQU 000h
SCHREIBEN EQU 001h
■ Fehlernummern
EOF_KZ EQU 0FFh ; darf nicht 0 sein! (Lesen)
DISKVOLL EQU 0FFh ; darf nicht 0 sein! (Schreiben)
FALSCHER_MODE EQU 0FEh ; darf nicht 0 sein! (Öffnen, Erstellen,
; Lesen, Schreiben und Schließen)
CR EQU 0Dh ; ASCII-Code von RETURN
LF EQU 0Ah ; ASCII-Code von LINEFEED
CTRL_Z EQU 1Ah ; ASCII-Code von CTRL-Z
■ Aufbau des Modus-Bytes (= Variable FileMode):
Bit | Bedeutung | Aufschlüsselung der Bits
-------+---------------+-------------------------------------------
0..3 | Zugriffscode | 0000 nur Lesen \ Diese Bits werden
| | 0001 nur Schreiben > von den Routinen
| | 0010 Lesen + Schreiben / gesetzt
| |
| | Die folgenden Bits werden aus der Variable
| | FILEMODE ermittelt:
| |
4..6 | Sharing-Code | 000 Kompatibilitätsmodus
| | 001 ablehnender Schreib/Lese-Modus
| | 010 ablehnender Schreibmodus
| | 011 ablehnender Lesemodus
| | 100 nicht-ablehnender Modus
| |
7 | Inherit-Bit | 0 Zugriff für Unterprozesse erlaubt
| | 1 Zugriff für Unterprozesse verboten
■ Voreinstellungen für die Modi:
write_modus EQU 002h ; für RewriteFileBuffered
; (für APPEND auch Lesen zulassen)
read_modus EQU 000h ; für ResetFileBuffered
■ Aufbau des Attributes für die Erstellung einer neuen Datei
(= Variable CreateRFileAttr)
Bit | Bedeutung
-------+---------------
0 | Read-Only-Bit
1 | Hidden-Bit
2 | System-Bit
3 | Volume-Bit
4 | SubDir-Bit
5 | Archive-Bit
6 | reserviert, sollte 0 sein
7 | reserviert, sollte 0 sein
8-15 | reserviert, soltte 0 sein
----------------------------
CreateFileBuffered
Funktion: Anlegen einer neuen Datei
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
AX = Dateinummer
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei noch auf
Bes.: Die Variable CREATEFILEATTR enthält das Attribut für
die Datei.
Eine bestehende Datei wird überschrieben, d.h. gelöscht!
----------------------------
CreateNewFileBuffered
Funktion: Anlegen einer neuen Datei
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
AX = Dateinummer
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei noch auf
Bes.: Die Variable CREATEFILEATTR enthält das Attribut für
die neue Datei.
Eine bestehende Datei wird nicht überschrieben, sondern
führt zu einem Fehler!
----------------------------
ResetFileBuffered
Funktion: Öffnen einer bestehenden Datei zum Lesen
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
AX = Dateinummer
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei noch auf
Bes.: Die Variable FILEMODE enthält den Modus für die
Eröffnung der Datei.
----------------------------
RewriteFileBuffered
Funktion: Öffnen einer bestehenden Datei zum Schreiben
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
AX = Dateinummer
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei noch auf
Bes.: Die Variable FILEMODE enthält den Modus für die
Eröffnung der Datei
----------------------------
AppendFileBuffered
Funktion: Öffnen einer bestehenden Datei zum Anfügen am Ende
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
AX = Dateinummer
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei noch auf
Bes.: Falls die Variable UseControlZ ungleich 0 ist,
wird ein CTRL-Z am Dateiende der bestehenden Datei
überschrieben.
Die Variable FILEMODE enthält den Modus für die
Eröffnung der Datei.
----------------------------
ReadFileBuffered
Funktion: Lesen einer bestimmten Anzahl Zeichen aus einer Datei
Eingabe: ES:DI -> Puffer für die Zeichen
DS:BX -> Datei-Tabelle
CX = Anzahl max. zu lesender Zeichen
mit CX <= 255
Ausgabe: CF = 0 ->> okay
der Puffer ist mit dem gelesen String
(incl. Längenbyte) gefüllt.
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE
->> Datei nicht zum Lesen auf
AH = EOF_KZ ->> EOF
Bes.: Falls die Variable UseControlZ ungleich 0 ist, wird
CTRL-Z als Dateiende interpretiert.
Alle anderen ASCII-Steuerzeichen (auch CR und LF!) werden
nicht interpretiert.
----------------------------
ReadlnFileBuffered
Funktion: Lesen aus der Datei bis zum nächsten Zeilen- bzw.
Dateiende
Als Markierung für das Zeilenende werden folgende
Zeichenfolgen erkannt:
CR
CR und LF
LF und CR
Eingabe: ES:DI -> Puffer für den String
DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
Der Puffer ist mit dem gelesenen String
(incl. Längenbyte) gefüllt.
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE
->> Datei nicht zum Lesen auf
AH = EOF_KZ ->> EOF
Bes.: Falls die Variable UseControlZ ungleich 0 ist, wird
CTRL-Z als Dateiende interpretiert.
Alle anderen ASCII-Steuerzeichen (außer CR und LF)
werden nicht interpretiert.
----------------------------
WriteFileBuffered
Funktion: Sequentielles Schreiben in eine Datei
Eingabe: DS:SI -> Zu schreibender String
DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
String geschrieben
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei nicht zum
Schreiben auf
AH = DISK_VOLL ->> Diskette voll
----------------------------
WritelnFileBuffered
Funktion: Sequentielles Schreiben in eine Datei mit CR/LF
Eingabe: DS:SI -> String
DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
String geschrieben
CF = 1 ->> Fehler
AX = Fehlernummer
AH = FALSCHER_MODE ->> Datei nicht zum
Schreiben auf
AH = DISK_VOLL ->> Diskette voll
----------------------------
FlushFileBuffer
Funktion: Schreibt den Puffer
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
Puffer geschrieben
CF = 1 ->> Fehler
AH = FALSCHER_MODE ->> Datei nicht zum
Schreiben auf
AH = DISK_VOLL ->> Disk ist voll
Bes.: Ab der DOS-Version 3.30 werden auch die internen DOS-Puffer
über die Funktion 68h des Interrupt 21h geschrieben.
----------------------------
CloseFileBufferd
Funktion: Leeren des Puffers (bei Eröffnung zum SCHREIBEN) und
Schliessen der Datei
Eingabe: DS:BX -> Datei-Tabelle
Ausgabe: CF = 0 ->> okay
CF = 1 ->> Fehler
AX = Fehlernummer
AH = DISKVOLL ->> Diskette ist voll
Bes.: Falls UseControlZ ungleich 0 ist, so wird vor dem
Schliessen der Datei noch ein CTRL-Z in diese
geschrieben.