home *** CD-ROM | disk | FTP | other *** search
- /********************************************************/
- /* Modul: SCREENH.C */
- /* stellt Textwindows und schnelle Textausgabe */
- /* in definierten Windows zur Verfügung */
- /********************************************************/
-
- #include <stdlib.h>
- #include <string.h>
- #include <conio.h>
- #include <dir.h>
- #include <io.h>
- #include <dos.h>
- #include <alloc.h>
- #include "serv.h"
-
- /* einige Variablen aus dem Hauptmodul LOADER.C */
- extern int temphandle;
- extern char tempname[50];
- extern struct text_info ti;
-
- unsigned *s_st; /* Zeiger auf Beginn des Window-
- stacks */
- unsigned *s_st_top; /* Zeiger auf 1. freies Wort des
- Windowstacks */
- signed char s_st_ind=-1;/* Index für Windows (max.
- stmax) */
- int swappage=0; /* Seitennummer des aktuellen
- Stacks */
- int far *videoseg; /* Pointer auf Segment des Bild-
- schirmadapters */
-
- windows s_stack[STINDMAX];/* Array für die Windows */
- windows initpage=
- {NULL,NULL,0,0,0,79,24,7,0,0,0,0x0B0D,NULL};
-
- windows *wptr=&initpage;/* wptr ist der Zeiger auf die ak-
- tuellen Windowdaten, vorbesetzt
- mit initpage */
-
- /* screenhandler : ---
- Hier folgt nun die eigentliche Routinen für die Bild-
- schirmunterstützung. Zur Verfügung stehen damit dem
- Anwender:
- 1 : scroll + oder - n Zeilen 'rauf
- oder 'runter
- 2 : window_clear lösche aktives Window
- 3 : window_push lege neues Window auf den
- Stack und aktiviere es
- 4 : window_get hole verdeckten window
- Inhalt vom Stack
- 5 : window_pop hole verdeckten window
- Inhalt vom Stack und akti-
- viere altes window
- In der Prozedurdatei zu dBASE/FoxBase sind unter den
- obigen Namen die Schnittstellen zu diesem Programm ange-
- geben. Die drei letzten Funktionen kennen auch eine
- Fehlerrückmeldung. Falls bei push, get und pop kein
- Fehler aufgetreten ist enthält der Aufrufstring hinter
- dem Doppelpunkt (also an der 4. Stelle) eine 0, anderen-
- falls eine Ziffer größer als 0 (s.u.). */
- void screenhandler (int subfunc, unsigned ds, unsigned bx)
- {
- char *cmdstr;
- switch (subfunc)
- {
- /******************************************************/
- /* SCROLL */
- /* Form : 11:<n> */
- /* mit <n> +/-Dezimalzahl */
- /******************************************************/
- case 1 :
- {
- int lines;
- cmdstr=MK_FP(ds,bx); /* Setze cmdstr auf den übergebenen
- String */
- lines=atoi(cmdstr); /* Ermittle aus dem String die An-
- zahl der Zeilen */
- wscroll(lines); /* scroll (siehe Modul SERV.C)*/
- break;
- }
- /******************************************************/
- /* CLR_WINDOW */
- /* Form: 12: */
- /******************************************************/
- case 2 :
- wclear(); /* siehe Modul SERV.C */
- break;
- /******************************************************/
- /* WRITE_STRING */
- /* direktes Schreiben, absolute Koordianten */
- /* Form: 13:<y>,<x>,<col>;<string> */
- /* mit <y> Zeile [0..24] */
- /* <x> Spalte [0..79] */
- /* <col> Farbe [0..255] */
- /* <string> Text */
- /******************************************************/
- case 3 :
- {
- int cx,cy,col; /* Koordinaten für die Ausgabe und
- Farbe */
- char *pos; /* Zeiger auf den zu zerlegenden
- String */
- cmdstr=MK_FP(ds,bx);
- pos=cmdstr;
- cy=atoi(pos); /* Hole die Werte aus dem String,
- die */
- pos=strchr(pos,',')+1; /* durch Kommata getrennt sein
- müssen */
- cx=atoi(pos);
- pos=strchr(pos,',')+1;
- col=atoi(pos);
- pos=strchr(pos,';')+1; /* Der Text wird durch ein Semi-
- kolon abgetrennt */
- if (pos!=NULL) /* Falls die Zeichenkette hier
- noch nicht zu Ende ist ... */
- dispstr(pos,cy,cx,col);/* schreibe sie direkt in den
- Bildschirmspeicher */
- break;
- }
- /******************************************************/
- /* WRITE_STRING */
- /* mit Zeichenkontrolle und window relativer */
- /* Cursorpositionierung */
- /* Form: 14:<y>,<x>,<col>;<string> */
- /* Erläuterung siehe oben */
- /* oder: 14:<col>;<string> */
- /* Zeichenausgabe ab aktueller Cursor- */
- /* position */
- /******************************************************/
- case 4 :
- {
- int cx,cy,col; /* wie oben */
- char *pos,*search;
- cmdstr=MK_FP(ds,bx);
- pos=cmdstr;
- /* Suche nach Vorkommen von ',' oder ';'. Falls zuerst
- ein ';' auftaucht, liegt Form 2 vor sonst Form 1.
- Der unzulässige Fall, daß gar nichts entdeckt wird,
- wird auch gleich mit abgefangen. */
- for (search=pos;
- *search!=0 && *search!=';' && *search!=',';
- search++);
- if (*search==0)
- break;
- if (*search==',')
- {
- cy=atoi(pos);
- pos=strchr(pos,',')+1;
- cx=atoi(pos);
- pos=strchr(pos,',')+1;
- col=atoi(pos);
- pos=strchr(pos,';')+1;
- wptr->attr=col;
- if (pos!=NULL)
- {
- setwcurpos((cy<<8)|cx); /* positioniere Cursor
- (siehe Modul SERV.C)*/
- wputs(pos); /* schreibe Text (siehe
- Modul SERV.C) */
- }
- }
- else
- {
- col=atoi(pos);
- pos=strchr(pos,';')+1;
- wptr->attr=col;
- if (pos!=NULL)
- {
- wputs(pos); /* schreibe Text (siehe
- Modul SERV.C) */
- }
- }
- break;
- }
- /******************************************************/
- /* WINDOW_PUSH */
- /* Form: 14:<uly>,<ulx>,<lry,<lrx>, */
- /* <fr_attr>,<fr_type>,<attr>;<string> */
- /* mit <y> Zeile [0..24] */
- /* <x> Spalte [0..79] */
- /* <col> Farbe [0..255] */
- /* <string> Text */
- /* Ergebnis : 0 */
- /* Fehler: */
- /* 2 : Stack voll */
- /* 3 : ungültige Parameter */
- /******************************************************/
- case 5 :
- {
- int ulx,uly,lrx,lry; /* Window Koordinaten:
- upper left x usw. */
- int size,fr_attr,fr_type,attr; /* siehe Def. struct
- window */
- char fr_attrs[5],attrs[5]; /* Stringdefinitionen der
- Farben nach dBASE */
- char *pos,*posn;
- cmdstr=MK_FP(ds,bx); /* Zerlege String */
- pos=cmdstr;
- uly=atoi(pos);
- pos=strchr(pos,',')+1;
- ulx=atoi(pos);
- pos=strchr(pos,',')+1;
- lry=atoi(pos);
- pos=strchr(pos,',')+1;
- lrx=atoi(pos);
- pos=strchr(pos,',')+1;
-
- strncpy(fr_attrs,pos,
- (size_t)((posn=strchr(pos,','))-pos));
- *(fr_attrs+(int)((posn++)-pos))=0;
- pos=posn; /* Hier wurde der Farbname für den
- Rahmen gelesen */
-
- fr_type=atoi(pos); /* hier die Art (einfach, doppelt
- usw.) */
- pos=strchr(pos,',')+1;
-
- strncpy(attrs,pos,(size_t)((posn=strchr(pos,';'))-pos));
- *(attrs+(int)((posn++)-pos))=0;
- pos=posn; /* und hier die Farbe für den
- Inhalt des Windows */
-
- if (temphandle==0) /* falls noch kein swap file
- geöffnet wurde ... */
- {
- getcwd(tempname,sizeof tempname-1); /* ... hole Ver-
- zeichnisname, */
- strcat(tempname,"\\"); /* füge ein '\' dran */
- temphandle=creattemp(tempname,0); /* hole von DOS
- einen noch nicht
- existiierenden
- Dateinamen und
- öffne damit eine
- Binärdatei */
- }
- if (*fr_attrs)
- fr_attr=attr_string(fr_attrs); /* Wandele Farbnamen in
- Farbnummer um (siehe
- Modul SERV.C) */
- else
- fr_attr=7;
- if (*attrs)
- attr=attr_string(attrs);
- else
- attr=7;
- if (uly>=0 && uly<25 && ulx>=0 && ulx<80 && lry>=uly
- && lry<25 && lrx>=ulx && lrx<80)
- /* Koordinaten sind gültig */
- {
- if (s_st_ind<STINDMAX-1) /* maximale Anzahl Fenster
- noch nicht erreicht */
- {
- if (s_st_top+(size=(lrx-ulx+1)*(lry-uly+1))>
- s_st+stmax)
- /* Rest der Pufferseite zu klein für Window */
- {
- /* swap out page */
- lseek(temphandle,swappage*stmax,0);
- write(temphandle,s_st,stmax*2);
- swappage++; /* Pufferseite +1 */
- memset(s_st,0,stmax*2); /* setze Puffer auf 0 */
- s_st_top=s_st; /* stack top = stack begin */
- }
- s_stack[s_st_ind+1].s_p=s_st_top; /* Trage stack top
- im Array ein, er
- stellt den
- Pointer zum Puf-
- ferbereich dar.
- */
- s_st_top+=size; /* neuer stack top */
- s_stack[s_st_ind+1].s_np=s_st_top; /* eintragen */
- /* aktuelle Seitennummer: */
- s_stack[s_st_ind+1].s_swappage=swappage;
- s_st_ind++; /* Window index */
- wptr=&s_stack[s_st_ind]; /* Zeiger auf neue Window-
- Daten */
- wptr->curs_shape=getcurshape(); /* Sichere letzte
- Cursorform, */
- wptr->curs_pos=getcurpos(); /* und letzte
- Position
- (siehe Modul
- SERV.C)*/
- wopen(wptr->s_p,ulx,uly,lrx,lry,attr,fr_type,
- fr_attr,pos);
- /* Öffne Fenster (siehe Modul SERV.C) */
- ccmdstr(0,cmdstr); /* O.K. (siehe Modul SERV.C) */
- }
- else
- ccmdstr(2,cmdstr);
- }
- else
- ccmdstr(3,cmdstr);
- break;
- }
- /******************************************************/
- /* WINDOW_GET */
- /* Ergebnis : 0 */
- /* Fehler: */
- /* 2 : Stack leer */
- /******************************************************/
- case 6 :
- {
- cmdstr=MK_FP(ds,bx);
- if (s_st_ind>-1)
- {
- puttext(wptr->ulx+1,wptr->uly+1,wptr->lrx+1,
- wptr->lry+1,wptr->s_p);
- /* Hole verdeckten Text zurück */
- ccmdstr(0,cmdstr);
- }
- else
- ccmdstr(2,cmdstr);
- break;
- }
- /******************************************************/
- /* WINDOW_POP */
- /* Ergebnis : 0 */
- /* Fehler: */
- /* 2 : Stack leer */
- /* 3 : ungültige Parameter */
- /******************************************************/
- case 7 :
- {
- cmdstr=MK_FP(ds,bx);
- if (s_st_ind>-1)
- {
- puttext(wptr->ulx+1,wptr->uly+1,wptr->lrx+1,
- wptr->lry+1,wptr->s_p);
- /* schreibe gesicherten Bildschirminhalt zurück */
- setcurpos(wptr->curs_pos); /* gesicherte Cur-
- sorposition */
- setcurshape(wptr->curs_shape); /* gesicherte Cur-
- sorform */
- s_stack[s_st_ind].s_p=NULL; /* setze Pointer
- auf NULL */
- s_st_ind--;
- if (s_st_ind>-1 && s_stack[s_st_ind].s_swappage!=
- swappage)
- /* das letzte aktive Window befindet sich eine
- Seite vorher */
- {
- /* setze swappage zurück */
- swappage=s_stack[s_st_ind].s_swappage;
- /* positioniere swap file */
- lseek(temphandle,swappage*stmax*2,0);
- /* lese */
- read(temphandle,s_st,stmax*2);
- /* setze Größe zurück */
- chsize(temphandle,tell(temphandle));
- }
- if (s_st_ind>-1)
- {
- s_st_top=s_stack[s_st_ind].s_np; /* setze stack top */
- wptr=&s_stack[s_st_ind]; /* aktives Window */
- }
- else
- {
- s_st_top=s_st; /* Anfangsdaten */
- wptr=&initpage;
- }
- ccmdstr(0,cmdstr);
- }
- else
- ccmdstr(2,cmdstr);
- break;
- }
- }
- }