home *** CD-ROM | disk | FTP | other *** search
- /* Window.C: Funktionen zur schnellen Textausgabe, zum Verwenden von
- Windows, zum Erstellen von Auswahl-Menüs, zur komfortablen
- Stringeingabe usw.
-
- Version 1.0sw vom 14.06.90
-
- Dies ist eine Shareware-Version. Der Quelltext darf NICHT geändert
- werden. Programme, die auf Funktionen dieser Toolbox zurückgreifen,
- dürfen nur für eigene Zwecke verwendet und NICHT weitergegeben oder
- verkauft werden! Hierzu ist eine REGISTRIERUNG erforderlich.
- Die Vollversion ist für DM 79,-- erhältlich bei:
-
- Jürgen Altfeld
- Hofkurat-Diehl-Str. 7
-
- 8042 Oberschleißheim
-
- Weitere Informationen siehe begleitende Text-Dateien.
- */
-
- /* Arbeitet in den Speichermodellen Small und Medium unter Umständen
- inkorrekt, weil die Macros FP_OFF und FP_SEG verwendet werden!
- Genauere Informationen: Hilfe (F1-Taste) zu den obigen Macros
- anzeigen lassen.
-
- Beim inkrementalen Kompilieren tritt manchmal die Warnung C4414
- ('funktion' neu definiert) auf. Sie kann ignoriert werden. */
-
- #include <stdio.h>
- #include <graph.h>
- #include <stdlib.h>
- #include <dos.h>
- #include <malloc.h>
- #include <string.h>
- #include <ctype.h>
- #include <bios.h>
-
-
-
- #define WAHR 1
- #define FALSCH 0
-
- #define NORMAL 7 /* Definition der Bildschirm-Farbattribute */
- #define HELL 15 /* für monochrome Grafikkarte */
- #define INVERS 0x70
- #define UNTERSTRICHEN 1
- #define UI 9 /* Unterstrichen und Hell! */
-
- #define SCHWARZ 0 /* Farbattribute für die Farbgrafik-Karte */
- #define BLAU 1
- #define GRUEN 2
- #define ZYAN 3
- #define ROT 4
- #define VIOLETT 5
- #define BRAUN 6
- #define WEISS 7
- #define DUNKELGRAU 8
- #define HELLBLAU 9
- #define HELLGRUEN 10
- #define HELLZYAN 11
- #define HELLROT 12
- #define HELLVIOLETT 13
- #define GELB 14
- #define HELLWEISS 15
-
-
- #pragma check_pointer( off ) /* Zeigerprüfung ausschalten:
- Die Toolbox greift mit Hilfe von Zeigern
- auf den Bildschirmspeicher zu. Dies führt
- normalerweise zu dem Fehler "Bereich-
- überschreitung eines Zeigers". Deshalb
- wird hier die Zeigerprüfung ausgeschaltet
- */
-
-
- int f0 = 23, /* gobale Variable zum Speichern des normalen, */
- f1 = 30, /* sowie des ersten, */
- f2 = 28, /* zweiten */
- f3 = 16; /* und dritten hervorgehobenen Farb-Attributs */
-
- unsigned int screen; /* Globle Variable zum Speichern des Video-Segments */
- unsigned int farbe; /* Graphik-Karte (0 = monochrom; 1 = Farbe) */
- int select; /* Abbruchs-Code der Funktion "UseMenu" */
- int fehler; /* Fehler-Nummer */
- static short shape; /* Gestalt des Hardware-Cursors */
- static int cursattr; /* Farb-Attribut des Auswahl-Cursors */
-
- static struct window
- {
- int x, y; /* linke obere Window-Ecke */
- int dx, dy; /* Breite und Höhe des Windows */
- int wattr; /* Hintergrund-Farbe des Windows */
- int rand, rattr; /* Rand-Art und Rand-Farbe */
- char *name; /* Zeiger auf Window-Überschrift (Namen) */
- int xpos; /* X-Koordinate der Überschrift */
- int nattr; /* Farbe der Überschrift */
- struct window *vorher; /* Zeiger auf vorher geöffnetes Window */
- void *wmalloc; /* Zeiger auf Puffer-Speicher für Hintergrund */
- };
- typedef struct window WINDOW;
-
- static struct menu
- {
- int x, y; /* Position des Menüpunktes am Bildschirm */
- int nattr; /* Farb-Attribut des Menüpunkt-Namens */
- char *name; /* Zeiger auf Namen des Menüpunktes */
- int nr; /* Identifikationsnummer des Menüpunktes */
- char page; /* Flag für neue Seite (<> 0 : 1. MP der Seite) */
- struct window *window; /* Zeiger auf vorher zu öffnendes Window */
- struct menu *sub; /* Zeiger auf ersten Menüpunkt des Untermenüs */
- struct menu *next; /* Zeiger auf nächsten Menüpunkt */
- struct menu *prev; /* Zeiger auf vorherigen Menüpunkt */
- struct menu *father; /* Zeiger auf Vatermenü des Submenüs */
- };
- typedef struct menu MENU;
-
-
- static struct window *lastopen; /* Zeiger auf Structur des zuletzt
- geöffneten Windows */
-
-
-
- /* die notwendigsten Funktions-Prototypen definieren: */
-
- int attribut( int vg, int hg, int blinken );
- void CloseAll( void ); /* Prototyp aus Syntax-Gründen definieren */
- MENU * first( MENU *item ); /* Prototyp aus Syntax-Gründen definieren */
- MENU * FirstPage( MENU *item ); /* " */
- void hinweis( char *text );
-
-
-
-
- /************************************************************
- * Funktion: hardfehler *
- * Der INT 24h (Hardware-Fehler) wird auf *
- * diese Funktion umgeleitet, um auch bei *
- * kritischen Fehlern die volle Kontrolle *
- * über Hardware-Zugriffe (insbesondere *
- * Festplatten- und Diskettenzugriffe) zu *
- * behalten. Ist z. B. ein Laufwerkshebel *
- * nicht verriegelt, wird diese Funktion *
- * aufgerufen. *
- * Eingabe: keine Werte *
- * Ausgabe: Fehlercode von DOS *
- * Hinweis: Diese Routine darf niemals (!) direkt *
- * von einer anderen Funktion aufgerufen *
- * werden (unvorhersehbare Ergebnisse!). *
- ************************************************************/
-
- void far hardfehler( unsigned gf, unsigned doserr, unsigned far *g )
- {
- fehler = 1; /* Bei einigen C-Funktionen arbeitet der _hardretn-
- Befehl fehlerhaft. Als Umweg wird diese Variable
- als Flag verwendet (z. B. bei _dos_getdiskfree:
- Der "doserr"-Fehlercode wird nicht zurück-
- gemeldet. Vielmehr meint das Programm, es sei
- KEIN Fehler aufgetreten!). */
- _hardretn( doserr ); /* Return mit Fehlercode des DOS */
- /* Der Programmablauf wird an der Stelle nach
- der Funktion fortgesetzt, bei der der Fehler
- aufgetreten ist. */
- }
-
-
-
- /************************************************************
- * Funktion: get_vsegment() *
- * Ermittelt die Segmentadresse des Video-RAM *
- * Ausgabe: Die Segmentadresse des Video-RAM's als *
- * unsigned int. *
- ************************************************************/
-
- unsigned int get_vsegment()
- {
- _asm
- {
- mov ax,40h
- push ds ; Datensegment retten
- mov ds,ax ; Datensegment auf die BIOS-Variablen setzen
- mov bx,63h ; Portadresse des 6845-Video-Chips holen
- mov ax,[bx]
- cmp ax,3b4h ; ist Portadresse von einer Monochrom-Karte?
- jne gv1
- mov ax,0b000h ; ja, dann ist das Video-Segment bei 0xB000
- jmp gv_ende ; beende die Funktion
- gv1:
- mov ax,0b800h ; ja, dann ist das Video-Segment bei 0xB800
- gv_ende:
- pop ds ; Datensegment wiederherstellen
- }
- }
-
-
- /********************************************************
- * Funktion: set_textmode *
- * Setzt den zum Bildschirm passenden *
- * Textmodus, löscht den Bildschirm, *
- * schaltet auf die erste Bildschirmseite *
- * und speichert in der Variablen farbe *
- * 0 (null) für Monochrom- bzw. 1 (eins) *
- * für Farb-Graphik-Karte *
- * Ausgabe: 0 (null) bei Fehler, sonst erfolgreich *
- ********************************************************/
-
- int set_textmode()
- {
- if( screen == 0xB000)
- farbe = FALSCH; /* MDA bzw. Herkules installiert */
- else farbe = WAHR;
- do
- {
- if( farbe == FALSCH )
- {
- if( _setvideomode( _TEXTMONO ) )
- break;
- return ( FALSCH ); /* Fehlermeldung zurückgeben */
- }
- farbe = WAHR;
- if( _setvideomode( _TEXTC80 ) )
- break;
- if( _setvideomode( _TEXTBW80 ) )
- break;
- return ( 0 ); /* Fehlermeldung zurückgeben */
- } while( WAHR == WAHR );
- if( _setactivepage( 0 ) < 0 )
- return ( FALSCH ); /* Fehlermeldung zurückgeben */
- return ( WAHR );
- }
-
-
-
- /*********************************************************
- * Funktion: OpenTool *
- * Bereitet die Toolbox zur Benutzung vor. *
- * Eingabe: keine Werte *
- * Ausgabe: bei Fehler den Wert null *
- *********************************************************/
-
- int OpenTool( void )
- {
- if( _osmajor < 3 ) /* Ist die aktuelle DOS-Version kleiner 3? */
- {
- printf( "\n\n\nDieses Programm läuft nur unter DOS 3.0 und höher!\n\n");
- return( FALSCH ); /* Abbruch mit Fehlermeldung */
- }
- screen = get_vsegment(); /* Segment-Adresse des Screens ermitteln */
- if( set_textmode() == FALSCH ) /* Fehler beim Initialisieren */
- {
- printf( "\n\n\n\n\n" );
- printf( "Die Grafikkarte unterstützt keinen passenden Text-Modus!\n\n" );
- printf( "Es können nur folgende Grafikkarten (oder kompatible) verwendet werden:\n\n" );
- printf( "MDA, Herkules, CGA, EGA, VGA; hierzu kompatible Karten...\n\n\n" );
- return( FALSCH ); /* Fehler-Meldung */
- }
-
- lastopen = NULL; /* kein Window offen */
-
- select = 0; /* Flag bei Menüauswahl auf "kein Fehler" setzen */
-
- if( farbe == FALSCH ) /* keine Farbgrafikkarte installiert? */
- {
- f0 = NORMAL; /* Farb-Attribute für den Bildschirm festlegen */
- f1 = HELL;
- f2 = UNTERSTRICHEN;
- f3 = UI;
- cursattr = attribut( SCHWARZ, WEISS, 1 ); /* Auswahl-Cursor blinkend */
- }
- else
- {
- f0 = attribut( WEISS, BLAU, 0 );
- f1 = attribut( GELB, BLAU, 0 );
- f2 = attribut( HELLROT, BLAU, 0 );
- f3 = attribut( SCHWARZ, BLAU, 0 );
- cursattr = -1; /* Auswahl-Cursor invers */
- };
-
- if( (shape = _gettextcursor()) == -1 ) /* Form des Hardware-Cursors */
- shape = 0x0607; /* holen und merken */
- if( _settextcursor( 0x2000 ) == -1 ) /* Hardware-Cursor ausschalten */
- return( FALSCH ); /* Fehler-Meldung */
- _amblksiz = 32767; /* Setze Speicheranforderungen von MALLOC
- an das Betriebssystem auf Blöcke zu
- 32 KB, damit ein schnellerer Zugriff
- hierauf möglich wird! */
-
- _harderr( hardfehler ); /* verbiege Hardware-Fehler-Routine */
- hinweis( "Shareware-Version! Weitergabe und Änderungen verboten!" );
- hinweis( "(C) by J. Altfeld, Hofkurat-Str. 7, D-8042 Oberschleißheim" );
- return( WAHR );
- }
-
-
-
- /********************************************************
- * Funktion: CloseTool *
- * Bereitet die Toolbox für die Beendigung *
- * der Benutzung vor. *
- * Eingabe: keine Werte *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void CloseTool( void )
- {
- hinweis( "Shareware-Version! Weitergabe und Änderungen verboten!" );
- hinweis( "(C) by J. Altfeld, Hofkurat-Str. 7, 8042 Oberschleißheim" );
- CloseAll(); /* schließt alle noch offenen Windows */
- _settextcursor( shape ); /* alten Form des Hardware-Cursors setzen */
- }
-
-
-
- /*********************************************************
- * Funktion: _locate *
- * Berechnet die Offsetadresse einer *
- * beliebigen Cursorposition im Bildschirm- *
- * speicherbereich. *
- * Eingabe: Spalte und Zeile des Cursors *
- * (0 - 79, 0 - 24) *
- * Ausgabe: Offsetadresse der Cursorposition *
- *********************************************************/
-
- unsigned int _locate( int x, int y )
- {
- _asm
- {
- mov ax,word ptr x ; Spalten-Position holen
- mov dl,al
- mov ax,word ptr y ; Zeilen-Position holen
- mov dh,al
- mov al,160
- mul dh ; Zeile * 160
- shl dl,1 ; Spalte * 2
- xor dh,dh ; DH mit 0 laden
- add ax,dx ; Zeile * 160 + Spalte * 2
- }
- }
-
-
-
- /******************************************************
- * Funktion: _print *
- * Schreibt einen Textstring direkt in *
- * den Bildschirmspeicher. *
- * Eingabe: Offsetadresse der Cursorposition, *
- * Bildschirmattribut (für die Farbe), *
- * far pointer zum Text *
- * Ausgabe: keine Werte *
- * Steuerzeichen: "\n" (DB 10) für Zeilenvorschub *
- ******************************************************/
-
- void _print( unsigned int position, int attribut, char far *text )
- {
- unsigned int o,s;
- char dbs[] = {
- 83,104,97,114,119,97,114,101,45,84,111,111,108,98,111,120,32,
- 118,111,110,32,87,73,78,68,79,87,46,67,32,118,101,114,119,101,110,
- 100,101,116,32,45,32,87,101,105,116,101,114,103,97,98,101,32,
- 118,101,114,98,111,116,101,110,33,32,84,101,108,46,32,87,101,
- 115,116,32,71,101,114,109,97,110,121,32,40,48,56,57,41,32,
- 51,49,53,32,52,52,52,52,32,105,110,102,111,114,109,105,101,
- 114,101,110,33,0
- }; /* undok. stc. von Quick-C 2.0 */
-
- if( text == NULL ) /* kein auszugebender Text vorhanden */
- return;
- o = FP_OFF( text );
- s = FP_SEG( text );
- _asm
- {
- push ds ; Daten-Segment retten
- push es ; Extra-Segment retten
- push di
- push si ; REGISTER-Variablen retten
- mov ax,word ptr screen ; Bildschirm-Segment-Adresse holen
- mov es,ax ; und in ES speichern
- mov ax,word ptr s ; Segmentadresse des Textes holen
- mov ds,ax ; und in DS speichern
- mov si,word ptr o ; Offsetadresse des Textes holen
- mov di,word ptr position ; Offsetadresse des "Cursors" holen
- push di ; aktuelle Cursorposition merken
- mov ax,word ptr attribut ; Screen-Attribut holen
- mov ah,al ; und in AH speichern
- _print1:
- mov al,[si] ; hole ein Zeichen des Textes
- and al,al ; \0 Markierung erreicht? (=Stringende)
- je _printende ; ja, dann beende Ausgabe
- cmp al,10 ; Steuercode LF angetroffen?
- jne _print2
- pop di ; ja, dann gehe an Anfang der neuen Zeile
- add di,160
- push di ; rette aktuelle Cursorposition wieder
- inc si ; Quelltext auf neues Zeichen setzen
- jmp _print1 ; nächste(s) Zeichen ausgeben
- _print2:
- mov word ptr es:[di],ax ; nein, dann Zeichen in Bildschirm schreiben
- inc si
- inc di
- inc di ; Quelltext und Ziel auf neue Position setzen
- jmp _print1 ; nächstes Zeichen ausgeben
- _printende:
- pop di ; aktuelle Cursorposition aus Stack entfernen
- pop si
- pop di
- pop es
- pop ds ; Register wiederherstellen
- }
- }
-
-
-
- /********************************************************
- * Funktion: fastprint *
- * Schreibt einen Textstring direkt in *
- * den Bildschirmspeicher. *
- * Eingabe: Spalte und Zeile des Cursors, *
- * Bildschirmattribut (Farbe), *
- * far pointer zum Text *
- * Ausgabe: keine Werte *
- * Steuerzeichen: "\n" (DB 10) für Zeilenvorschub *
- ********************************************************/
-
- void fastprint( int x, int y, int attribut, char far *text )
- {
- unsigned int adresse;
- adresse = _locate( x, y );
- _print( adresse, attribut, text );
- }
-
-
-
- /********************************************************
- * Funktion: _xchars *
- * Schreibt ein bestimmtes Zeichen x-mal *
- * an eine bestimmte Stelle im Bildschirm- *
- * speicher *
- * Eingabe: Offsetadresse der Cursorposition *
- * Bildschirmattribut (Farbe) *
- * Anzahl der auszugebenden Zeichen *
- * Auszugebendes Zeichen *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void _xchars( unsigned int adresse, int attribut,
- int anzahl, unsigned char zeichen )
- {
- _asm
- {
- push es ; ES retten
- mov ax,screen ; Bildschirm-Segment-Adresse holen
- mov es,ax
- mov ax,word ptr attribut ; Bildschirmattribut holen
- mov ah,al
- mov al,zeichen ; auszugebendes Zeichen holen
- mov di,word ptr adresse ; Offsetadresse des "Cursors" holen
- mov cx,word ptr anzahl ; Anzahl der auszugebenden Zeichen
- _chars1:
- mov word ptr es:[di],ax ; Zeichen mit Attribut ausgeben
- inc di
- inc di ; Cursor um eine Spalte nach rechts setzen
- loop _chars1 ; wiederhole die Ausgabe
- pop es ; ES wiederherstellen
- }
- }
-
-
-
- /********************************************************
- * Funktion: string *
- * Schreibt ein bestimmtes Zeichen x-mal *
- * an eine angegebene Cursor-Position *
- * Eingabe: Spalte und Zeile des Cursors *
- * Bildschirmattribut *
- * Anzahl der auszugebenden Zeichen *
- * auszugebendes Zeichen *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void string( int x, int y, int attribut, int anzahl, unsigned char zeichen )
- {
- unsigned int adresse;
- adresse = _locate( x, y );
- _xchars( adresse, attribut, anzahl, zeichen );
- }
-
-
-
- /********************************************************
- * Funktion: wcls *
- * Löscht einen Teilbereich des *
- * Bildschirms mit einer beliebigen Farbe *
- * Eingabe: Spalte und Zeile der linken oberen Ecke *
- * Anzahl der zu löschenden Spalten und *
- * Zeilen *
- * Bildschirm-Attribut (Farbe) *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void wcls( int x, int y, int xx, int yy, int attribut )
- {
- yy = y + yy; /* Endzeile der Ausgabe berechnen */
- for( ; y < yy; y++ )
- string( x, y, attribut, xx, ' ' );
- }
-
-
-
- /********************************************************
- * Funktion: cls *
- * Löscht den gesamten Bildschirm *
- * Eingabe: Farb-Attribut *
- * Ausgaben: keine Werte *
- ********************************************************/
-
- void cls( int attr )
- {
- wcls( 0, 0, 80, 25, attr );
- }
-
-
-
- /********************************************************
- * Funktion: _getxchars *
- * Holt eine bestimmte Anzahl von Zeichen *
- * mit dem dazugehörigen Attribut aus dem *
- * Bildschirmspeicher und legt diese Daten *
- * im angegebenen Speicherbereich ab. *
- * Eingabe: Offsetadresse der Cursorposition *
- * Anzahl der zu lesenden Zeichen *
- * far pointer zum Pufferspeicher (mit *
- * ausreichend Platz für Anzahl mal zwei *
- * Bytes, da jedes Zeichen mit Attribut *
- * in den Puffer gespeichert wird!) *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void _getxchars( unsigned int adresse, unsigned int anzahl,
- void far *puffer )
- {
- unsigned int o, s;
- o = FP_OFF( puffer );
- s = FP_SEG( puffer );
- _asm
- {
- push ds
- push es ; Segmentregister retten
- push si
- push di ; Registervariablen retten
- mov ax,word ptr screen
- mov es,ax ; ES mit Bildschirm-Segment laden
- mov ax,word ptr s
- mov ds,ax ; DS mit Daten-Segment laden
- mov si,word ptr adresse ; Offsetadresse des Cursors holen
- mov di,word ptr o ; " " Pufferspeichers holen
- mov cx,anzahl ; Anzahl der zu kopierenden Zeichen holen
- _getxchars1:
- mov ax,es:[si] ; hole ein Zeichen mit Attribut
- mov [di],ax ; und speichere es im Puffer ab
- inc si
- inc si
- inc di
- inc di ; nächsten Adressen berechnen
- loop _getxchars1 ; wiederhole, bis alle Zeichen gepuffert sind
- pop di
- pop si
- pop es
- pop ds ; Register wiederherstellen
- }
- }
-
-
-
- /********************************************************
- * Funktion: wget *
- * Holt alle Zeichen (mit Attribut) eines *
- * Bildschirm-Ausschnittes und speichert *
- * diese im angegebenen Pufferbereich ab. *
- * Eingabe: Spalte und Zeile der linken oberen *
- * Windowecke *
- * Breite und Höhe des Windows *
- * far pointer zum Pufferspeicher *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void wget( int x, int y, int breite, int hoehe, void *puffer )
- {
- unsigned int adresse;
- adresse = _locate( x, y );
- hoehe += y;
- for( ; y < hoehe; y++ )
- {
- _getxchars( adresse, breite, puffer );
- puffer = (char *)puffer + (breite << 1); /* Puffer = Puffer+2*breite */
- adresse = adresse + 160;
- }
- }
-
-
-
- /********************************************************
- * Funktion: putxchars *
- * Schreibt alle Zeichen (mit Attribut) *
- * eines Puffers in den Bildschirmspeicher *
- * Eingabe: Offsetadresse der Cursorposition *
- * Anzahl der zu schreibenden Zeichen *
- * far pointer zum Pufferspeicher, in dem *
- * die Zeichen mit dem jeweils dazugehöri- *
- * gen Attribut gespeichert sind *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void putxchars( unsigned int adresse, int anzahl, void far *puffer )
- {
- unsigned int o, s;
- o = FP_OFF( puffer );
- s = FP_SEG( puffer );
- _asm
- {
- push ds
- push es ; Segmentregister retten
- push si
- push di ; Registervariablen retten
- mov ax,word ptr screen
- mov es,ax ; ES mit Bildschirm-Segment laden
- mov ax,word ptr s
- mov ds,ax ; DS mit Daten-Segment laden
- mov di,word ptr adresse ; Offsetadresse des Cursors holen
- mov si,word ptr o ; " " Pufferspeichers holen
- mov cx,anzahl ; Anzahl der zu kopierenden Zeichen holen
- putxchars1:
- mov ax,[si] ; hole ein Zeichen mit Attribut
- mov es:[di],ax ; und schreibe es in den Bildschirmspeicher
- inc si
- inc si
- inc di
- inc di ; nächsten Adressen berechnen
- loop putxchars1 ; wiederhole, bis alle Zeichen ausgegeben
- pop di
- pop si
- pop es
- pop ds ; Register wiederherstellen
- }
- }
-
-
- /********************************************************
- * Funktion: wput *
- * Schreibt die angegebene Anzahl von *
- * Zeichen (mit Attribut) aus dem Puffer *
- * in den Bildschirmspeicher *
- * Eingabe: Spalte und Zeile der linken oberen *
- * Windowecke *
- * Breite und Höhe des Windows *
- * far pointer zum Pufferspeicher *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void wput( int x, int y, int breite, int hoehe, void *puffer )
- {
- unsigned int adresse;
- adresse = _locate( x, y );
- hoehe += y;
- for( ; y < hoehe; y++ )
- {
- putxchars( adresse, breite, puffer );
- puffer = (char *)puffer + (breite << 1); /* Puffer = Puffer+2*breite */
- adresse = adresse + 160;
- }
- }
-
-
-
- /********************************************************
- * Funktion: getanzahl *
- * Ermittelt die erforderliche Größe eines *
- * Pufferspeichers in Chars, die für ein *
- * bestimmtes Window notwendig sind, um *
- * den Bildschirminhalt mit der Funktion *
- * _wget zu puffern. *
- * Eingabe: Breite und Höhe des Bildschirm- *
- * ausschnittes *
- * Ausgabe: Puffergröße in CHARS ( = Bytes ) *
- ********************************************************/
-
- int getanzahl( int x, int y )
- {
- return ( x*y << 1 ); /* X * Y * 2 */
- }
-
-
-
- /********************************************************
- * Funktion: rahmen *
- * Zeichnet einen Rahmen mit der *
- * gewünschten Linienart *
- * Eingabe: Spalte und Zeile der Ecke links oben *
- * Breite und Höhe des Rahmens *
- * Linienart *
- * 0 = Doppelstrich, 1 = einfacher Strich *
- * 2 = Blockzeichen, 3 = waagrecht doppelt,*
- * senkrecht einfacher Rahmen *
- * Bildschirm-Attribut (Farbe) *
- * Ausgabe: keine Werte *
- ********************************************************/
-
- void rahmen( int x, int y, int breite, int hoehe, int art, int attribut )
- {
- unsigned int adresse;
- unsigned char lo, ro, lu, ru, wa, se;
- switch( art )
- {
- case 1:
- lo = 218, ro = 191, lu = 192, ru = 217;
- wa = 196, se = 179;
- break;
- case 2:
- lo = ro = lu = ru = wa = se = 219;
- break;
- case 3:
- lo = 213, ro = 184, lu = 212, ru = 190, wa = 205, se = 179;
- break;
- default:
- lo = 201, ro = 187, lu = 200, ru = 188;
- wa = 205, se = 186;
- }
- adresse = _locate( x, y );
- hoehe += y - 2;
- _xchars( adresse, attribut, 1, lo );
- _xchars( adresse+2, attribut, breite-2, wa );
- _xchars( adresse+2*breite-2, attribut, 1, ro );
- for( adresse += 160; y < hoehe; y++ )
- {
- _xchars( adresse, attribut, 1, se );
- _xchars( adresse+2*breite-2, attribut, 1, se );
- adresse += 160;
- }
- _xchars( adresse, attribut, 1, lu );
- _xchars( adresse+2, attribut, breite-2, wa );
- _xchars( adresse+2*breite-2, attribut, 1, ru );
- }
-
-
-
- /********************************************************
- * Funktion: attribut *
- * Ermittelt ein Bildschirm-Farbattribut *
- * anhand der angegebenen Farbwerte *
- * Eingaben: Vordergrundfarbe (0 - 15) *
- * Hintergrundfarbe (0 - 8) *
- * Blinken (0 = nein, sonst ja) *
- * Ausgabe: Bildschirm-Farbattribut *
- ********************************************************/
-
- int attribut( int vg, int hg, int blinken )
- {
- int attr;
- attr = (hg << 4) | vg;
- if( blinken )
- attr |= 128;
- return( attr );
- }
-
-
-
- /********************************************************
- * Funktion: OpenWindow *
- * Öffnet das angegebene Window *
- * Eingabe: Zeiger auf WINDOW-Structur *
- * Ausgabe: bei Fehler den Wert null *
- ********************************************************/
-
- int OpenWindow( WINDOW *wi )
- {
- void *puffer;
- if( wi == NULL )
- return( FALSCH ); /* Fehler: kein Window-Zeiger angegeben */
- if( wi->wmalloc != NULL )
- return( FALSCH ); /* Fehler: Window ist bereits offen! */
- puffer = (void *) malloc( getanzahl( wi->dx, wi->dy ) );
- if( puffer == NULL )
- return( FALSCH ); /* Fehler ist: Kein Speicher für Puffer frei */
- wi->vorher = lastopen; /* Zeiger auf vorher geöffnetes Window */
- wi->wmalloc = puffer; /* Adresse des Puffers speichern */
- lastopen = wi; /* zuletzt geöffnetes Window merken */
- wget( wi->x, wi->y, wi->dx, wi->dy, wi->wmalloc ); /* Hintergrund retten */
- rahmen( wi->x, wi->y, wi->dx, wi->dy, wi->rand, wi->rattr );
- wcls( wi->x + 1, wi->y + 1, wi->dx - 2, wi->dy - 2, wi->wattr );
- if( wi->name == NULL )
- return( WAHR ); /* Beende Funktion ohne Fehler */
- fastprint( wi->xpos, wi->y, wi->nattr, wi->name ); /* Überschrift */
- return( WAHR ); /* Beende Funktion ohne Fehler */
- }
-
-
- /************************************************
- * Funktion: CloseWindow *
- * Schließt das letzte Window *
- * Eingabe: keine Werte *
- * Ausgabe: null, wenn alle Windows zu sind *
- ************************************************/
-
- int CloseWindow()
- {
- WINDOW *wi;
- if( lastopen == NULL )
- return( FALSCH ); /* Fehler: Alle Windows sind bereits zu */
- wput( lastopen->x, lastopen->y, lastopen->dx, lastopen->dy,
- lastopen->wmalloc ); /* Oberstes Window schließen */
- free( lastopen->wmalloc ); /* Puffer-Speicher wieder freigeben! */
- wi = lastopen->vorher; /* Vorheriges Window holen */
- lastopen->wmalloc = NULL; /* Markierung: Window geschlossen */
- lastopen = wi; /* Oberstes Window ist nun das vorherige */
- return( WAHR ); /* Beende Funktion ohne Fehler */
- }
-
-
-
- /****************************************
- * Funktion: CloseAll *
- * Schließt alle Windows. *
- * Eingabe: keine Werte *
- * Ausgabe: keine Werte *
- ****************************************/
-
- void CloseAll( void )
- {
- while( lastopen != NULL )
- CloseWindow();
- }
-
-
- /********************************************************
- * Funktion: PrepareMenu *
- * Bereitet die Benutzung einer Menü- *
- * struktur vor, indem alle notwendigen *
- * Zeiger-Verkettungen hergestellt werden. *
- * Eingabe: Zeiger auf Stru. des ERSTEN Menüpunktes *
- * Zeiger auf Vater-Menüstruktur *
- * Ausgabe: keine Werte *
- * Besonderheit: rekursiver Aufruf von sich selbst!!! *
- * Es müssen lediglich die NEXT-Zeiger *
- * bereits vorher init. worden sein! *
- ********************************************************/
-
- void PrepareMenu( MENU *first, MENU *vater )
- {
- MENU *p1;
- if( first == NULL )
- return;
- p1 = NULL; /* Erster Menüpunkt */
- do
- {
- first->father = vater; /* jeden Menüpunkt auf Vater zeigen lassen */
- first->prev = p1; /* Vorangehenden Menüpunkt eintragen */
- p1 = first;
- if( first->sub != NULL )
- PrepareMenu( first->sub, first ); /* Submenü initialisieren */
- } while( (first = first->next) != NULL );
- }
-
-
-
- /********************************************************
- * Funktion: OutMenu *
- * Gibt ein komplettes Menü aus (ohne die *
- * Submenüs natürlich!) *
- * Eingabe: Zeiger auf den ersten Menüpunkt *
- * Ausgabe: keine Werte *
- * Hinweis: Ein Window wird nur dann geöffnet, wenn *
- * der ERSTE Menüpunkt auf die Window- *
- * Struktur zeigt! *
- ********************************************************/
-
- void OutMenu( MENU *item )
- {
- MENU *i1 = item; /* Aktuellen Menüpunkt zwischenspeichern */
- i1 = FirstPage( item ); /* ersten Menüpunkt der 1. Seite ermitteln */
- item = first( item ); /* ersten Menüpunkt der Seite holen */
-
- if( i1->window != NULL )
- OpenWindow( i1->window );
- do
- {
- fastprint( item->x, item->y, item->nattr, item->name );
- } while( (item = item->next) != NULL && item->page == 0 );
-
- }
-
-
-
- /************************************************
- * Funktion: cursor *
- * Legt fest, welche Farbe der *
- * Auswahl-Cursor bei den Menü- *
- * punkten bzw. der Input-Cursor *
- * haben soll. *
- * Eingabe: Farb-Attribut *
- * (-1 bedeutet: Invertiere die *
- * momentane Farbe des *
- * Auswahl-Cursors) *
- * Ausgabe: keine Werte *
- ************************************************/
-
- void cursor( int attr )
- {
- if( attr == -1 )
- cursattr = attr;
- else
- cursattr = (attr % 256 );
- }
-
-
-
- /************************************************
- * Funktion: invert *
- * Invertiert das Farb-Attribut *
- * Eingabe: Farb-Attribut *
- * Ausgabe: invertiertes Farb-Attribut *
- ************************************************/
-
- int invert( int attr )
- {
- int b;
- b = attr;
- b <<= 4; /* Bits um vier Stellen nach links schieben */
- b &= 127; /* das Blink-Bit (Bit 8) ausblenden */
- attr >>= 4; /* Bits um vier Stellen nach rechts schieben */
- attr &= 15; /* Zur Sicherheit das höherwertige Nibble ausblenden */
- b += attr; /* vertauschten Attribut-Nibbles zusammenfügen */
- /* Hier könnte auch stehen: b |= attr (ist dasselbe!) */
- return( b ); /* Farb-Attribut mit vertauschter Vorder- und Hinter-
- grundfarbe zurückgeben */
- }
-
-
- /************************************************
- * Funktion: CursorFarbe *
- * Errechnet die Farbe des Aus- *
- * wahl-Cursors. *
- * Eingabe: Farb-Attribut des aktuellen *
- * Menüpunktes/Input-Zeichens *
- * Ausgabe: Cursor-Attribut des Auswahl- *
- * Cursors. *
- ************************************************/
-
- int CursorFarbe( int attr )
- {
- if( cursattr == -1 )
- return( invert( attr ) );
- return( cursattr );
- }
-
-
-
- /************************************************
- * Funktion: input *
- * Eingabe von Text *
- * Eingabe: X und Y der Textposition *
- * Farb-Attribut des Textes *
- * Zeiger auf den reservierten *
- * Speicherplatz für den Text *
- * (Max. Länge ist gleich der *
- * Länge des Speicherplatzes) *
- * Stelle des Cursors (relativ *
- * zum Beginn des Textes). *
- * Ausgabe: Zeiger auf den reserv. Speicher *
- * NULL, wenn die Eingabe mit *
- * ESC abgebrochen wurde! *
- * Hinweis: Wird eine ungültige Cursor- *
- * Position angegeben, so steht *
- * der Cursor am Ende des Textes *
- * (kann absichtlich dazu miß- *
- * braucht werden, z. B. -1!). *
- ************************************************/
-
- char * input( int x, int y, int attr, char *text, int c )
- {
- int a, laenge;
- unsigned int b;
- char z[] = { " " }; /* Puffer für ein Zeichen (auf dem Cursor steht) */
-
- laenge = strlen( text ); /* Länge des Textpuffers ermitteln */
- if( c < 0 || c > laenge ) /* ungültige Cursorposition angegeben? */
- {
- c = laenge; /* dann gehe zum Textende */
- while( c > 0 && text[c-1] == 32 ) /* suche letzte Stelle im */
- c--; /* Text, die kein Leerzeichen ist */
- }
- z[0] = text[c];
- fastprint( x, y, attr, text ); /* Textpuffer ausgeben */
- fastprint( x+c, y, CursorFarbe( attr ), z ); /* Cursor ausgeben */
-
- while( (a = getch()) != 13 )
- {
- fastprint( x+c, y, attr, z ); /* Cursor löschen */
-
- if( a == 0 )
- {
- a= getch(); /* erw. Tastaturcode holen */
-
- if( a == 0x4B && c > 0 ) /* Taste "Cursor links" gedr.? */
- c--; /* Cursor um eine Stelle nach links */
-
- if( a == 0x4D && c < laenge ) /* Taste "Cursor rechts" gedr.? */
- c++; /* Cursor um eine Stelle nach rechts */
-
- if( a == 0x47 ) /* Taste "HOME" gedrückt? */
- c = 0; /* ja, dann gehe an Stelle eins */
-
- if( a == 0x4F ) /* Taste "END" gedrückt? */
- {
- c = laenge;
- while( c > 0 && text[c-1] == 32 ) /* suche letzte Stelle im */
- c--; /* Text, die kein Leerzeichen ist */
- }
-
- if( a == 0x53 && c < laenge ) /* Zeichen auf Cursor löschen und */
- { /* den Rest des Textes um eine Stelle nach */
- /* links schieben --- Taste DEL */
- for( a = c; a < laenge - 1; a++ )
- text[a] = text[a+1];
- text[laenge-1] = 32; /* letztes Zeichen mit " " füllen */
- fastprint( x, y, attr, text ); /* Text neu ausgeben */
- }
-
- }
-
- else
- {
-
- if( a == 27 ) /* ESC gedrückt ? */
- return( NULL ); /* dann dies zurückmelden */
-
- if( a == 8 && c > 0 ) /* Zeichen links vom Cursor löschen und */
- { /* den Rest des Textes um eine Stelle nach */
- c--; /* links schieben */
- for( a = c; a < laenge - 1; a++ )
- text[a] = text[a+1];
- text[laenge-1] = 32; /* letztes Zeichen mit " " füllen */
- fastprint( x, y, attr, text ); /* Text neu ausgeben */
- }
- if( a > 31 && c < laenge)
- {
- b = _bios_keybrd( _KEYBRD_SHIFTSTATUS ); /* hole Status-Byte */
- if( (b & 128) == 0 ) /* wenn INS eingeschaltet ist, */
- {
- for( b = laenge - 1; b > c; b-- )
- text[b] = text[b-1]; /* dann schiebe Text nach rechts */
- fastprint( x, y, attr, text ); /* Text neu ausgeben */
- }
- text[c] = a; /* eingegebenes Zeichen speichern */
- string( x + c, y, attr, 1, a ); /* Zeichen ausgeben */
- c++; /* Cursor um eine Stelle nach links */
- }
- }
-
- z[0] = text[c]; /* Zeichen auf Cursor zwischenspeichern */
- if( z[0] == 0 ) /* Ende des Stringpuffers erreicht? */
- z[0] = 32;
- fastprint( x+c, y, CursorFarbe( attr ), z ); /* Cursor ausgeben */
- }
-
- fastprint( x+c, y, attr, z ); /* Cursor löschen */
- return( text );
- }
-
-
-
- /************************************************
- * Funktion: first *
- * Sucht den ersten Menüpunkt *
- * einer Seite. *
- * Eingabe: Zeiger auf einen Menüpunkt *
- * Ausgabe: Zeiger auf den ersten Menü- *
- * punkt der Seite *
- ************************************************/
-
- MENU * first( MENU * item )
- {
- while( item->page == 0 )
- {
- if( item->prev == NULL )
- break; /* kein Vorgänger mehr vorhanden */
- item = item->prev;
- }
- return( item ); /* Eintrag ist erster Eintrag */
- }
-
-
-
- /************************************************
- * Funktion: FirstPage *
- * Sucht den ersten Menüpunkt der *
- * ersten Seite *
- * Eingabe: Zeiger auf einen Menüpunkt *
- * Ausgabe: Zeiger auf ersten Menüpunkt *
- ************************************************/
-
- MENU * FirstPage( MENU *item )
- {
- while( item->prev != NULL )
- {
- item = item->prev;
- item = first( item );
- }
- return( item );
- }
-
-
-
- /************************************************
- * Funktion: last *
- * Sucht den letzten Menüpunkt der *
- * aktuellen Seite. *
- * Eingabe: Zeiger auf einen Menüpunkt *
- * Ausgabe: Zeiger auf letzen Menüpunkt *
- ************************************************/
-
- MENU * last( MENU *item )
- {
- while( item->next != NULL )
-
-
- if( (item->next)->page == 0 )
- item = item->next;
- else
- break;
- return( item ); /* Rückgabe des Zeiger auf letzen MP */
- }
-
-
-
- /************************************************
- * Funktion: LastPage *
- * Sucht den letzten Menüpunkt der *
- * letzten Seite *
- * Eingabe: Zeiger auf einen Menüpunkt *
- * Ausgabe: Zeiger auf letzten Menüpunkt *
- ************************************************/
-
- MENU * LastPage( MENU *item )
- {
- while( item->next != NULL )
- {
- item = item->next;
- item = last( item );
- }
- return( item );
- }
-
-
-
- /*********** Funktion hinweis ************/
-
- void hinweis( char *text )
- {
- WINDOW w1 = { 8, 8, 64, 5, f1, 3, f3, " ACHTUNG: ", 36, f3, 0, 0 };
-
- if( OpenWindow( &w1 ) == 0 )
- return;
- fastprint( 10, 10, f1, text );
-
- _asm
- {
- mov bx,90
- push bx
- sub ah,ah
- int 1ah
- pop bx
- add bx,dx
- delay1: push bx
- int 1ah
- pop bx
- cmp bx,dx
- jnb delay1
- }
-
- CloseWindow();
- }
-
-
-
- /************************************************
- * Funktion: GoLeft *
- * Sucht einen Menüpunkt direkt *
- * links neben dem angegebenen *
- * aktuellen Menüpunkt. *
- * Eingabe: aktueller Menüpunkt *
- * Ausgabe: linker Menüpunkt *
- * Hinweis: Gibt es keinen linken Menü- *
- * punkt, wird der aktuelle *
- * Menüpunkt wieder zurückgegeben. *
- ************************************************/
-
- MENU * GoLeft( MENU * item )
- {
- int x, y, merker = 0;
- MENU *i1, *i2 = item;
-
- i1 = first( item ); /* Anfang der Seite ermitteln */
- x = item->x;
- y = item->y; /* Position des aktuellen Menüpunktes */
-
- do
- { /* Seite nicht überschr. wird */
- if( i1->y == y ) /* gleiche Höhe? */
- {
- if( i1->x < x && i1->x > merker )
- {
- merker = i1->x;
- i2 = i1; /* linken Menüpunkt gefunden... */
- }
- }
- i1 = i1->next; /* nächsten Menüpunkt holen */
- } while( i1 != NULL && i1->page == 0 ); /* solange die aktuelle */
-
- return( i2 ); /* linken Menüpunkt zurückgeben */
- }
-
-
-
- /************************************************
- * Funktion: GoRight *
- * Sucht einen Menüpunkt direkt *
- * rechts neben dem angegebenen *
- * aktuellen Menüpunkt. *
- * Eingabe: aktueller Menüpunkt *
- * Ausgabe: rechter Menüpunkt *
- * Hinweis: Gibt es keinen rechten Menü- *
- * punkt, wird der aktuelle *
- * Menüpunkt wieder zurückgegeben. *
- ************************************************/
-
- MENU * GoRight( MENU * item )
- {
- int x, y, merker = 30000;
- MENU *i1, *i2 = item;
-
- i1 = first( item ); /* Anfang der Seite ermitteln */
- x = item->x;
- y = item->y; /* Position des aktuellen Menüpunktes */
-
- do
- { /* Seite nicht überschr. wird */
- if( i1->y == y ) /* gleiche Höhe? */
- {
- if( i1->x > x && i1->x < merker )
- {
- merker = i1->x;
- i2 = i1; /* rechten Menüpunkt gefunden... */
- }
- }
- i1 = i1->next; /* nächsten Menüpunkt holen */
- } while( i1 != NULL && i1->page == 0 ); /* solange die aktuelle */
-
- return( i2 ); /* rechten Menüpunkt zurückgeben */
- }
-
-
-
- /************************************************
- * Funktion: fl (first letter ) *
- * Sucht den ersten Buchstaben *
- * bzw. die erste Zahl in einem *
- * String. *
- * Eingabe: Zeiger auf den String *
- * Ausgabe: Position im String, an der der *
- * erste Buchstabe/Zahl steht *
- * (-1 wenn nichts gefunden!) *
- ************************************************/
-
- int fl( char *text )
- {
- int a;
- for( a = 0; a <= strlen( text ); a++ )
- {
- if( alnum( (unsigned char) text[a] ) )
- return( a ); /* Rückgabe der Position */
- }
- return( -1 ); /* Rückgabe des Fehlerwertes */
- }
-
-
-
- /************************************************
- * Funktion: alnum *
- * Testet, ob das angegebene *
- * Zeichen ein alphanumerisches *
- * Zeichen ist (incl. dt. Umlaute) *
- * Eingabe: ASCII-Zeichen *
- * Ausgabe: 0, wenn kein alnum Zeichen *
- ************************************************/
-
- int alnum( int zeichen )
- {
- if( isalnum( zeichen ) )
- return( 1 ); /* Zeichen ist alnum */
- switch( zeichen )
- {
- case 'ä':
- case 'Ä':
- case 'ö':
- case 'Ö':
- case 'ü':
- case 'Ü':
- case 'ß':
- return( 1 ); /* Zeichen ist alnum */
- default:
- return( 0 ); /* Zeichen ist nicht alnum */
- }
- }
-
-
-
- /************************************************
- * Funktion: lower *
- * Wandelt das angegebene Zeichen *
- * in einen Kleinbuchstabe um, *
- * wenn es ein Buchstabe ist *
- * Eingabe: ASCII-Zeichen *
- * Ausgabe: ASCII-Zeichen *
- * Besonderheit: dt. Umlaute werden beachtet *
- ************************************************/
-
- int lower( int zeichen )
- {
- zeichen = tolower( zeichen );
- switch( zeichen )
- {
- case 'Ä':
- zeichen = 'ä';
- break;
- case 'Ö':
- zeichen = 'ö';
- break;
- case 'Ü':
- zeichen = 'ü';
- }
- return( zeichen );
- }
-
-
-
- /************************************************
- * Funktion: UseMenu *
- * Menü anzeigen und abfragen *
- * Eingabe: Zeiger auf ersten Punkt der *
- * Menüstruktur *
- * Ausgabe: Abbruchs-Code in "select": *
- * 0 = ENTER *
- * 1 = ESC im Hauptmenü *
- * 2 = F1 für Hilfe *
- * 3 = interner Fehler aufgetr. *
- * Zeiger auf Struktur der ausge- *
- * wählten Menüpunktes (NULL bei *
- * Fehler) *
- ************************************************/
-
- MENU * UseMenu( MENU *item )
- {
- int a, b;
- MENU *i1; /* Hilfsvariable */
-
- if( item == NULL )
- {
- select = 3; /* Interner Fehler: kein Zeiger übergeben */
- return( NULL );
- }
- OutMenu( item ); /* Menü ausgeben */
-
- while( WAHR == WAHR ) /* Endlos-Schleife */
- {
- fastprint( item->x, item->y, CursorFarbe( item->nattr ), item->name );
- /* Cursor invers ausgeben */
- a = getch(); /* warte auf Tastendruck */
-
- fastprint( item->x, item->y, item->nattr, item->name );
- /* Cursor löschen */
-
- if( alnum( a ) ) /* Ist a ein alphanum Zeichen (a-z, 1-9)? */
- {
- i1 = item; /* aktuelle Cursor-Position merken */
- a = lower( a ); /* gedrückte Taste in Kleinbuchst. umwand. */
- item = item->next;
-
- while( item != i1 )
- {
- if( item == NULL )
- {
- item = FirstPage( i1 );
- continue;
- }
- if( (b = fl( item->name )) != -1 )
- {
- if( lower( (unsigned char) item->name[b] ) == a )
- {
- OutMenu( item );
- goto ende; /* passenden Menüpunkt gefunden */
- }
- }
- item = item->next;
- }
- item = i1;
- ende:
- continue; /* keinen passenden MP gefunden */
- }
-
- if( a == 27 ) /* ESC gedrückt? */
- {
- if( FirstPage( item )->window != NULL && item->father != NULL)
- CloseWindow(); /* Evtl. geöffnetes Window schließen */
- item = item->father; /* Gehe zum Vater-Prozeß */
- if( item == NULL )
- {
- select = 1; /* Abbruch des Hauptmenüs mit ESC */
- return( NULL ); /* Abbruch ohne Zeiger auf Menüpunkt */
- }
- OutMenu( item ); /* Neues Menü ausgeben */
- continue; /* Endlos-Schleife wiederholen */
- }
-
- if( a == 13 ) /* ENTER gedrückt? */
- {
- if( item->sub == NULL )
- {
- select = 0;
- return( item ); /* Rückgabe des Zeigers auf gewählten MP */
- }
- item = item->sub; /* gehe in das Untermenü */
- OutMenu( item ); /* Untermenü ausgeben */
- continue; /* Endlos-Schleife wiederholen */
- }
-
- if( a != 0 ) /* Erweiterter Tastencode? */
- continue; /* ja, dann wiederhole die Endlos-Schleife */
-
- a = getch(); /* hole den erweiterten Tastaturcode */
-
- if( a == 0x47 ) /* Taste HOME gedrückt ? */
- {
- item = FirstPage( item ); /* ja, dann gehe zum ersten MP der */
- OutMenu( item ); /* ersten Seite */
- continue;
- }
-
- if( a == 0x4f ) /* Taste END gedrückt? */
- {
- item = LastPage( item ); /* ja, dann gehe zum letzten MP */
- OutMenu( item ); /* der letzten Seite */
- continue;
- }
-
- if( a == 0x48 ) /* Cursor hoch? */
- {
- if( item->prev == NULL )
- {
- item = LastPage( item );
- OutMenu( item );
- continue;
- }
- if( item->page != 0 ) /* am Seitenanfang? */
- {
- item = item->prev;
- OutMenu( item );
- continue;
- }
- item = item->prev;
- continue;
- }
-
- if( a == 0x50 ) /* Cursor runter ? */
- {
- if( item->next == NULL )
- {
- item = FirstPage( item );
- OutMenu( item );
- continue;
- }
- if( (item->next)->page != 0 )
- {
- item = item->next;
- OutMenu( item );
- continue;
- }
- item = item->next;
- continue;
- }
-
- if( a == 0x49 ) /* PgUp gedrückt? */
- {
- if( first( item )->prev != NULL )
- {
- item = first( first( item )->prev );
- OutMenu( item );
- continue;
- }
- }
-
- if( a == 0x51 ) /* PgDn gedrückt? */
- {
- if( last( item )->next != NULL )
- {
- item = last( item )->next;
- OutMenu( item );
- continue;
- }
- }
-
- if( a == 0x4B ) /* "Cursor links" gedrückt? */
- {
- i1 = item; /* merke aktuelle Cursor-Position */
- item = GoLeft( item ); /* linken Menüpunkt suchen */
- if( item != i1 ) /* neuen MP gefunden? */
- continue; /* ja */
- do
- {
- i1 = item;
- item = GoRight( item );
- } while( i1 != item ); /* beim linken Rand springe zum
- MP ganz rechts */
- }
-
- if( a == 0x4D ) /* "Cursor rechts" gedrückt? */
- {
- i1 = item; /* merke aktuelle Cursor-Pos. */
- item = GoRight( item ); /* rechten Menüpunkt suchen */
- if( item != i1 ) /* neuen MP gefunden? */
- continue; /* ja */
- do
- {
- i1 = item;
- item = GoLeft( item );
- } while( i1 != item ); /* beim rechten Rand springe zum
- MP ganz links */
-
- }
-
- if( a == 0x3b ) /* F1 für Hilfe gedrückt? */
- {
- select = 2;
- return( item );
- }
-
- }
- }
-
-
-
- /************************************************
- * Funktion: GoMain *
- * Schließt alle Fenster außer das *
- * des Main-Menüs. *
- * Eingabe: Zeiger auf einen Menüpunkt in *
- * irgeneinem Menü dieser Struktur *
- * Ausgabe: keine Werte *
- ************************************************/
-
- void GoMain( MENU *item )
- {
- if( item == NULL || lastopen == NULL ) /* Kein Window offen oder */
- return; /* Null-Zeiger übergeben? Dann Abbruch! */
- while( item->father != NULL )
- item = item->father; /* Suche das Main-Menü */
- item = FirstPage( item ); /* Suche ersten MP des Main-Menüs */
- if( item->window == NULL ) /* Window garnicht geöffnet? */
- return;
- if( item->window->wmalloc == NULL )
- return; /* dann Abbruch */
- while( lastopen != item->window || lastopen == NULL )
- CloseWindow(); /* Schließe alle Windows außer erstes */
- }
-
-
-
- /************************************************
- * Funktion: SortMpName *
- * Sortiert eine Anzahl von MP's *
- * in aufsteigender Reihenfolge *
- * anhand des Namens. *
- * Eingabe: Zeiger auf ersten Menüpunkt *
- * Anzahl der Menüpunkte *
- * Ausgabe: keine Werte (MP's jedoch sortiert) *
- ****************************************************/
-
- void SortMpName( MENU *first, int anzahl )
- {
- MENU *i1, *i2; /* Hilfsvariablen */
- char *t;
- register int b, a; /* schnelle Variablen */
-
- if( anzahl < 2 )
- return; /* Abbruch, keine Sortierung mögl. */
- i1 = first;
- for( a = 0; a < anzahl - 1; a++ )
- {
- i2 = i1;
- for( b = a + 1; b < anzahl; b++ )
- {
- i2 = i2->next;
- if( strcmp( i1->name, i2->name ) > 0 ) /* falsche Reihenfolge? */
- {
- t = i1->name;
- i1->name = i2->name;
- i2->name = t; /* ja, dann MP-Namen austauschen */
- }
- }
- i1 = i1->next;
- }
- }
-
-
-
- /************************************************
- * Funktion: inhalt *
- * Ermöglicht die Auswahl einer *
- * Datei innerhalb eines Windows, *
- * wobei auch Laufwerk oder Pfad *
- * geändert werden können. *
- * Eingabe: Pfad incl. Laufwerk *
- * Vorgabe für die Dateimaske *
- * Ausgabe: Zeiger auf die ausgewählte *
- * Datei incl. Pfad. *
- * Hinweis: Ist der Zeiger gleich NULL, so *
- * ist ein Fehler aufgetreten. *
- * In der globalen Variable fehler *
- * ist dann die Fehler-Nummer zu *
- * entnehmen. Folgende Fehler- *
- * Nummern sind möglich: *
- * 0 = kein Fehler aufgetreten *
- * 1 = Abbruch durch ESC *
- * 2 = Fehler beim Windowöffnen *
- * 3 = ungültiges Laufwerk *
- * 4 = Fehler bei malloc *
- * 5 = Disk-Zugriffs-Fehler *
- * 6 = sonst Fehler *
- * !!! Der zurückgegebene Zeiger auf *
- * die ausgewählte Datei (mit *
- * Pfad) sollte in der aufrufenden *
- * Funktion unbedingt in eine *
- * eigene Stringvariable kopiert *
- * werden (mit strcpy), da beim *
- * nochmaligen Aufruf dieser *
- * Funktion der alte String *
- * überschrieben wird!!! *
- ************************************************/
-
- char * inhalt( char *pfad_, char *maske1 )
- {
-
- hinweis( "Die Funktion 'inhalt' ist nur in der Vollversion verfügbar!" );
- fehler = 6;
- return( NULL );
-
- }
-
-
-
- /************************************************
- * Funktion: color *
- * Zeigt in einem Window alle 256 *
- * Text-Attribut-Farben an. Der *
- * Anwender kann dann auswählen, *
- * welche Farbe im am besten *
- * gefällt. *
- * Eingabe: anzuzeigender Textstring *
- * (darf auch NULL sein) *
- * Ausgabe: Bildschirm-Attribut-Byte *
- * ( 0 - 255; bei -1 wurde mit *
- * ESC abgebrochen oder es trat *
- * irgendein Fehler auf ) *
- ************************************************/
-
- int color( char *text )
- {
-
- hinweis( " Die Funktion 'color' ist nur in der Vollversion verfügbar!" );
- return( -1 );
-
- }
-