home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------- */
- /* BOOTCTRL.C, */
- /* (c) 1991 Elmar Warken & DMV-Verlag */
- /* Compiler: Turbo C, Turbo C++, Borland C++ */
- /* ------------------------------------------------- */
-
- /* Definitionen für den Aufbau einer Steuerdatei: */
- #define FileListBegin 50
- #define FileListLen 500
-
- #ifndef __BORLANDC__
- #pragma inline
- #elif __BORLANDC__ < 0x200
- #pragma inline
- #endif
-
- #include "driver.h"
-
- #define C(s) { for(c=s;*c++!=32&&*c!=10;); *--c=0; }
- /* Schneidet den als Parameter angegebenen String */
- /* nach dem ersten Leerzeichen oder beim Zeilenende */
- /* ab, der Zeiger c zeigt danach auf diese Position. */
-
- char
- b[8096], /* Puffer für Dateioperationen */
- f[10][FileListLen], /* Kopierlisten, f für files */
- s[FileListBegin + FileListLen], /* eine Zeile der */
- /* Steuerdatei */
- t[80], /* Parameter in CONFIG.SYS */
- e = 0; /* Errorflag */
-
- /* Da das Format der Gerätetreiber mit dem normalen */
- /* Startcode nicht hergestellt werden kann, wird der */
- /* Startcode durch das Modul DRIVER0.ASM ersetzt. */
- /* Daher können auch keine Standardbibliotheken ver- */
- /* wendet werden; die notwendigen Funktionen rufen */
- /* den Int 21 über die folgende Funktion direkt auf. */
- /* Die resultierende SYS-Datei ist daher mit Borland */
- /* C++ (286-Code, Standard Stack Frame off) nur 627 */
- /* Bytes groß. */
-
- int I(char*s, int h, int c, char cm)
- /* Ruft Interrupt 21h mit Unterfunktion cm auf. */
- /* Geeignet für folgende Funktionen: */
- /* Einlesen eines Strings cm = 7; */
- /* Ausgabe eines durch "$" begrenzten Strings cm = 9;*/
- /* Erstellen einer Datei cm = 60, s: Dateiname, */
- /* Rückgabe: handle; */
- /* Öffnen einer Datei für Leseoperationen cm = 61, */
- /* s: Dateiname, Rückgabe: handle; */
- /* Schließen einer Datei cm = 62, h: handle */
- /* Lesen aus einer Datei cm = 63, h: handle, c: zu */
- /* lesende Bytes, s: Datenpuffer, Rückgabe : Anzahl */
- /* der gelesenen Bytes; */
- /* Schreiben in eine Datei cm = 64, h: handle, c: zu */
- /* schreibende Bytes, s: Daten. */
- /* Der von DOS zurückgegebene Wert wird auch von der */
- /* Funktion zurückgegeben, im Falle eines Fehlers */
- /* wird das Errorflag gesetzt. */
-
- {
- asm mov ah, cm;
- asm mov al, 2;
- asm mov bx, h;
- asm mov cx, c;
- asm mov dx, s;
- asm int 21h;
- asm jnb X;
- asm mov e, 1;
- X:
- return(_AX);
- }
-
- void go()
- /* wird von M() in DRIVER.H aufgerufen */
- {
- char *n, *c, *d, /* Mehrzweckzeiger */
- *a; /* Zeiger in Parameterstring */
- int h, /* Handle der Steuerdatei */
- /* für das Kopieren : */
- q, /* Handle Quelle */
- z, /* Handle Ziel */
- j, i = 0;
-
- /* Die Zeile aus der CONFIG.SYS wird ab dem */
- /* Gleichheitszeichen in den String "t" kopiert. */
- /* Zu p siehe DRIVER.H */
- for(;*p -> l != 13; t[i++] = *p -> l++);
- t[i] = 32; C(t); a = c + 2;
- /* a zeigt jetzt auf den Namen der 1. Steuerdatei */
-
- while(*a != 0) {
- /* Öffnen der Menüdatei */
- C(a);
- h = I(a, 0, 0, 61); if (e) break;
- a = ++c; /* a zeigt bereits auf den */
- /* nächsten Namen in der Datei */
- d = f[0];
-
- /* gesamte Steuerdatei in Puffer einlesen, */
- /* max. 8 KByte Länge der Datei in i speichern. */
- i = I(n = b, h, 8096, 63);
- do{
- s[FileListBegin - 1] = 10;
- /* falls Zeile vor der 50. Spalte endet: */
- /* Zeilenende an 50. Spalte setzen, damit die */
- /* nächste while-Schleife funktioniert. */
- /* eine Zeile in s speichern: */
- for(c=s;(*c = *n++) != 10; c++, i--); i--;
- /* Text ausgeben: */
- I(s, 0, 0, 9); I("\n\r$", 0, 0, 9);
- /* zu kopierende Dateien speichern */
- /* (d zeigt in f-Array, c auf Spalte 50): */
- for(j = 0, c = s + 49; j++<FileListLen;
- *d++ = *c++);
- }
- while(i);
- /* Da i am Anfang gleich der Dateilänge ist, und */
- /* dann pro Zeichen dekrementiert wird, zeigt */
- /* i = 0 das Dateiende an. */
-
- I(0, h, 0, 62); /* Datei schließen */
-
- /* Nächstes Zeichen von der Tastatur lesen und */
- /* umwandeln */
- j = (I(0, 0, 0, 7) & 255) - 48;
- n = f[j];
- /* n zeigt jetzt auf die Liste der Dateien, die */
- /* kopiert werden sollen, das Listenende ist */
- /* durch das Zeilenende gekennzeichnet. */
- while (*n != 10)
- {
- C(n); /* Quelldateinamen begrenzen */
- d = ++c;
- C(d); /* ebenso Zieldateinamen */
- /* Dateien für das Umkopieren öffnen bzw. */
- /* erzeugen. */
- q = I(n, 0, 0, 61); if (e) break;
- z = I(d, 0, 0, 60);
-
- /* Datei in 8 KByte-Schritten kopieren, der */
- /* interne Interruptaufruf gibt die Zahl der */
- /* gelesenen Zeichen zurück. Wenn diese nicht */
- /* mehr gleich 8 KByte ist, ist das Dateiende */
- /* erreicht. */
- while(I(b, z, I(b, q, 8096, 63), 64) == 8096);
-
- /* Schließen der Dateien */
- I(0, q, 0, 62);
- I(0, z, 0, 62);
- n = ++c;
- /* n zeigt auf nächste Quelldatei oder auf das */
- /* Zeilenendezeichen */
- }
- }
- }
- /* ------------------------------------------------- */
- /* Ende von BOOTCTRL.C, */
-