home *** CD-ROM | disk | FTP | other *** search
- (* Mit diesem Programm soll versucht werden einen Nachteil des *)
- (* Prospero Pascals zu beseitigen. *)
- (* Diese Shell soll zeigen, wie man einen Compiler mit einer *)
- (* benutzerfreundlichen Oberfläche ausstatten kann. *)
-
- (* Geschrieben von : Peter Stöhr *)
- (* *)
- (* Verison 2.6 *)
- (* *)
-
- PROGRAM shell (input,output,datei);
-
- CONST
- {$I SHELL.I} (* Includefile des RSC *)
-
- TYPE
- STRING136 = STRING[136]; (* Datenstruktur für execprog *)
- {$I GEMTYPES.INC}
-
-
- VAR
- {$I VDICOMM.INC} (* Standart GEM-Variable *)
- work_in : work_in_type; (* Variable für v_opnwk *)
- work_out : work_out_type;
- gem_handle : handle_type; (* Handle für GEM-Routinen *)
- menue_addr : tree_ptr_type; (* Zeiger auf das Menü im RSC-File *)
- info_addr : tree_ptr_type; (* Zeiger auf Infobild in RSC-File *)
- aes_antwort : word; (* Antwort von AES-Proceduren *)
- i : INTEGER; (* Laufvariable *)
- gemprog : BOOLEAN; (* Flag ob GEM-Programm *)
- map : BOOLEAN; (* Flag ob Linkmap oder nicht *)
- leer_filename : filename_type; (* Leerer String für GEM-Routinen *)
- path_rename, (* Pfad für Rename-Funktion *)
- path_erase, (* Pfad für Datei löschen *)
- path_start, (* Pfad für Datei starten *)
- path_compiler, (* Pfad für compilieren und crossref *)
- path_link, (* Pfad für linken *)
- path_editor : filename_type; (* Pfad für Editor *)
- namen : ARRAY[1..5] OF STRING136; (* Namen von Compiler,Linker, ...*)
- (* 1 -> Compiler
- 2 -> Linker
- 3 -> Editor
- 4 -> Xref Programm
- 5 -> Pconfig
- *)
- externes_prg : ARRAY[1..5] OF STRING136; (* Compiler,Linker, ... *)
- vorhanden : ARRAY[1..5] OF BOOLEAN;
-
- {$I TOSFUNCS.INC}
- {$I VDIPROCS.INC} (* VDI-Routinen *)
- {$I AESPROCS.INC} (* AES-Routinen *)
-
-
- PROCEDURE EXECPROG(command : STRING136;var ret:INTEGER); external;
-
-
- PROCEDURE open_v_work; (* GEM-Programm starten *)
- VAR i : INTEGER; (* Laufvariable *)
- dummy : coord_type;
- BEGIN
- APPL_INIT; (* Applikation anmelden *)
-
- GRAF_HANDLE(dummy,dummy,dummy,dummy); (* Handle feststellen *)
- gem_handle := AESret; (* Ergebnis von graf_gem_handle holen *)
-
- FOR i := 0 TO 9 DO
- BEGIN
- work_in[i] := 1;
- END;
- work_in[7] := 0;
- work_in[10] := 2;
- V_OPNVWK(work_in,gem_handle,work_out);
- END;
-
-
- PROCEDURE close_v_work; (* GEM-Programm beenden *)
- VAR
- dummy : INTEGER;
- BEGIN
- V_CLSVWK(gem_handle); (* Bildschirm schlie₧en *)
- APPL_EXIT; (* Applikation ist beendet *)
- dummy := SYS0(0); (* Warmstart *)
- END;
-
-
- (* Wandelt GEM-String in PROSPERO-String um *)
- PROCEDURE convert_pack_string(ein : filename_type;VAR aus:STRING136);
- VAR
- i : INTEGER;
- BEGIN
- i := 1;
- aus := '';
- WHILE ((i <> 81) AND (ein[i] <> CHR(0))) DO
- BEGIN
- aus := CONCAT(aus,ein[i]);
- i := i + 1;
- END;
- END;
-
-
- (* Und jetzt umgekehrt *)
- PROCEDURE convert_string_pack (ein : STRING136;VAR aus : filename_type);
- VAR
- i : INTEGER;
- BEGIN
- aus := leer_filename;
- FOR i := 1 TO LENGTH(ein) DO
- aus[i] := ein[i];
- END;
-
-
- PROCEDURE set_path; (* Initalisiert die Path-Variablen *)
- VAR
- laufwerk : CHAR; (* Welches Laufwerk ist aktuelles Lw *)
- zwsp : STRING136;
- BEGIN
- laufwerk := CHR(ORD('A')+SYS0(19H)); (* Welches Lw ist aktuelles *)
-
- zwsp := CONCAT(laufwerk,':\*.*');
- convert_string_pack(zwsp,path_rename); (* Alle Dateiarten sind erlaubt *)
- path_erase := path_rename;
- path_start := path_rename;
- path_editor := path_rename;
- zwsp := CONCAT(laufwerk,':\*.PAS'); (* Nur '.PAS' Dateien werden compiliert *)
- convert_string_pack(zwsp,path_compiler);
- zwsp := CONCAT(laufwerk,':\*.BIN'); (* Nur '.BIN' Dateien werden gelinkt *)
- convert_string_pack(zwsp,path_link);
-
- END;
-
-
- PROCEDURE lade_namen; (* Die Namen werden geladen *)
- VAR
- datei : TEXT;
- alert : STRING136;
- i : INTEGER;
-
- BEGIN
- IF FSTAT('SHELL.CFG')
- THEN BEGIN (* Datei ist vorhanden *)
- ASSIGN(datei,'SHELL.CFG');
- RESET(datei);
- i := 1;
- WHILE (NOT EOF(datei) AND (i <= 5)) DO (* Namen einlesen *)
- BEGIN
- READLN(datei,namen[i]);
- IF namen[1][LENGTH(namen[i])] <> ' ' (* Ist letztes Zeichen Blank ? *)
- THEN namen[i] := CONCAT(namen[i],' '); (* Blank anhängen *)
-
- vorhanden[i] := FSTAT(namen[i]); (* Ist diese Datei vorhanden ? *)
- i := i + 1; (* Nächste Zeile holen *)
- END;
- END
- ELSE BEGIN
- alert := CONCAT('[3][Datei "SHELL.CFG" fehlt ! | ][Ende]',CHR(0));
- FORM_ALERT(1,alert[1]);
- RSRC_FREE; (* Speicher des RSC-Files freigeben *)
- close_v_work; (* GEM-Programm schlie₧en *)
- END;
-
- externes_prg[1] := 'Compiler'; (* Namen für Fehlermeldungen *)
- externes_prg[2] := 'Linker';
- externes_prg[3] := 'Editor';
- externes_prg[4] := 'Crossref';
- externes_prg[5] := 'PCONFIG';
- END;
-
-
- PROCEDURE fehlende_dateien(welche:INTEGER); (* Welches File fehlt *)
- VAR
- alert : STRING136;
- BEGIN
- alert := CONCAT('[3][Achtung ! |',externes_prg[welche],' |fehlt !][Okay]',CHR(0));
- FORM_ALERT(1,alert[1]);
- END;
-
-
- PROCEDURE lade_resource; (* Resource-File laden *)
- VAR
- file_name : filename_type; (* Name des RSC-File *)
- alert : STRING136; (* String für Alert-Box *)
- i : INTEGER;
-
- BEGIN
- convert_string_pack('SHELL.RSC',file_name); (* Namen in packed Array umwandeln *)
- RSRC_LOAD(file_name); (* RSC-File laden *)
- aes_antwort := AESret; (* Antwort von rsrc_load *)
- IF (aes_antwort = 0) (* Welches Ergebnis ? *)
- THEN BEGIN
- alert := CONCAT('[3][Achtung,da₧ RSC-File fehlt !| Programmabruch !][ Ende ]',CHR(0));
- FORM_ALERT(1,alert[1]); (* Alert-Box ausgeben *)
- close_v_work; (* Programm abbrechen *)
- END;
-
- RSRC_GADDR(0,MENUE,menue_addr); (* Adresse des Menübaums holen *)
- MENU_BAR(menue_addr,TRUE); (* Menüleiste sichtbar *)
- RSRC_GADDR(0,UEBER,info_addr); (* Adresse des Infobildchens *)
- END;
-
-
- PROCEDURE bildschirm; (* Desktop nach TOS-Prg. wieder aufbauen *)
- VAR
- koordinaten : rect_type;
- dummy : word;
- BEGIN
- koordinaten.corner.x := 0; (* Koordinaten für v_bar *)
- koordinaten.corner.y := 0; (* " *)
- koordinaten.width := 639; (* " *)
- koordinaten.height := 399; (* " *)
- dummy := VSF_INTERIOR(gem_handle,2); (* Fülltyp wie Desktop *)
- dummy := VSF_STYLE(gem_handle,4); (* " *)
- dummy := VSF_PERIMETER(gem_handle,FALSE); (* Keine Umrandung *)
- GRAF_MOUSE(256,0); (* Mouse weg *)
- V_BAR(gem_handle,koordinaten); (* Rechteck ausgeben *)
- GRAF_MOUSE(257,0); (* Mouse wieder her *)
- MENU_BAR(menue_addr,TRUE); (* Menüleiste sichtbar *)
- END;
-
-
- (* Aufgabe der Procedure :
- Ausgeben der Fileselctorbox,
- Sucht in dem mit path vorgegebenen Teil nach Dateien, path wird anschlie₧end auf den
- aktuellen Wert gesetzt
- File liefert Namen der Datei mit Path
- Erfolg : TRUE -> OK angeklickt
- FALSE -> CANCEL angeklickt *)
-
- PROCEDURE get_filename(VAR path : filename_type; (* Transienter Parameter *)
- VAR erg : STRING136; (* Ausgabeparameter *)
- VAR erfolg : BOOLEAN); (* Ausgabeparameter *)
- VAR
- filename,zwsp,path_zwsp : filename_type; (* Zwischenspeicher für Filenamen *)
- i : INTEGER; (* Laufvariable *)
- ende_zwsp,ende_path : INTEGER;
-
- BEGIN
- path_zwsp := path;
- zwsp := leer_filename;
- FSEL_INPUT(path,zwsp,erfolg); (* Box ausgeben *)
-
- IF erfolg
- THEN BEGIN (* 'OK' angeklickt *)
- i := 1; (* Ende des Dateinamen suchen *)
- WHILE ((i <> 81) AND (zwsp[i] <> CHR(0))) DO
- i := i + 1;
- ende_zwsp := i; (* Abspeichern *)
-
- i := 80; (* Letztes '\' im Path suchen *)
- WHILE ((i <> 0) AND (path[i] <> '\')) DO
- i := i - 1;
- ende_path := i; (* Markieren *)
-
- filename := path; (* Dateiname besteht aus Path *)
- FOR i := 1 TO ende_zwsp DO
- filename[ende_path+i] := zwsp[i]; (* Plus Datei *)
- convert_pack_string(filename,erg); (* In String umwandeln *)
- END
- ELSE BEGIN (* Cancelbox angeglickt *)
- path := path_zwsp; (* Alten Path rückspeichern *)
- erg := ''; (* Kein Ergebnis *)
- END;
- END;
-
-
- (* ------------------------------------------------------------------------------------- *)
- (* Routinen für Menüleiste *)
- (* ------------------------------------------------------------------------------------- *)
-
- PROCEDURE info_zeigen; (* Gibt kleines Info aus *)
- VAR
- x,y,w,h : coord_type; (* Grö₧e des Bildes *)
- koordinaten : rect_type; (* Variable für v_bar *)
- dummy : word;
- BEGIN
- FORM_CENTER(info_addr,x,y,w,h); (* Feld für Infobild berechnen *)
- FORM_DIAL(1,1,1,1,1,x,y,w,h); (* Wachsendes Rechteck *)
-
- OBJC_DRAW(info_addr,0,5,0,0,x+w+1,y+h+1); (* Feld ausgeben *)
-
- FORM_DO(info_addr,0); (* Warten bis Exitfeld angeklickt *)
-
- FORM_DIAL(2,1,1,1,1,x,y,w,h); (* Schrumpfendes Rechteck *)
- OBJC_CHANGE(info_addr,SCHLUSS,0,0,0,x+w,y+h,0,FALSE);
- (* Exitfeld Normal darstellen *)
- koordinaten.corner.x := x; (* Koordinaten für v_bar *)
- koordinaten.corner.y := y; (* " *)
- koordinaten.width := x+w; (* " *)
- koordinaten.height := y+h; (* " *)
-
- dummy := VSF_INTERIOR(gem_handle,2); (* Fülltyp wie Desktop *)
- dummy := VSF_STYLE(gem_handle,4); (* " *)
- dummy := VSF_PERIMETER(gem_handle,FALSE); (* Keine Umrandung *)
- GRAF_MOUSE(256,0); (* Mouse weg *)
- V_BAR(gem_handle,koordinaten); (* Rechteck ausgeben *)
- GRAF_MOUSE(257,0); (* Mouse wieder her *)
-
- END;
-
-
- PROCEDURE umbenennen; (* Datei umbenennen *)
- VAR
- alt,neu : STRING136; (* Alter und neuer Filename *)
- titel,alert : STRING136;
- datei : TEXT;
- koordinaten : rect_type; (* Koordinaten für Rechteck *)
- geklappt : BOOLEAN;
- dummy : word;
- BEGIN
- get_filename(path_rename,alt,geklappt); (* Welche Datei *)
- IF geklappt
- THEN BEGIN
- koordinaten.corner.x := 150; (* Weises Rechteck *)
- koordinaten.corner.y := 150;
- koordinaten.width := 500;
- koordinaten.height := 235;
- dummy := VSF_INTERIOR(gem_handle,0);
- dummy := VSF_STYLE(gem_handle,1); (* Weis *)
- dummy := VSF_PERIMETER(gem_handle,TRUE); (* Umrandung *)
- GRAF_MOUSE(256,0); (* Mouse weg *)
- V_BAR(gem_handle,koordinaten); (* Rechteck ausgeben *)
- alt := CONCAT(alt,CHR(0)); (* Ende für v_gtext markieren *)
- titel := CONCAT('Datei umbenennen : ',CHR(0));
- dummy := VST_EFFECTS(gem_handle,8); (* Unterstreichen an *)
- V_GTEXT(gem_handle,160,170,titel[1]);
- dummy := vst_effects(gem_handle,0); (* Normale Schrift *)
- V_GTEXT(gem_handle,160,200,alt[1]);
- WRITELN(chr(27),'e'); (* Cursor zeigen *)
- VS_CURADDRESS(gem_handle,14,21);
- READLN(neu); (* Neuen Namen einlesen *)
- WRITELN(chr(27),'f'); (* Cursor weg *)
- GRAF_MOUSE(257,0); (* Mouse wieder her *)
- IF (CHECKFN(neu) AND (NOT FSTAT(neu))) (* Name korrekt und noch nicht vergeben *)
- THEN BEGIN
- ASSIGN(datei,alt);
- RENAME(datei,neu); (* Datei wurde umbenannt *)
- END
- ELSE BEGIN
- alert := CONCAT('[3][Fehler bei "R E N A M E"][Okay]',CHR(0));
- FORM_ALERT(1,alert[1]);
- END;
- bildschirm;
- END;
- END;
-
-
- PROCEDURE datei_loeschen; (* Procedure zum löschen einer Datei *)
- VAR
- zu_loeschen,alert : STRING136;
- antwort : INTEGER;
- geklappt : BOOLEAN;
- datei : TEXT;
- BEGIN
- get_filename(path_erase,zu_loeschen,geklappt); (* Filename holen *)
- IF geklappt (* Es soll etwas gelöscht werden *)
- THEN BEGIN
- alert := CONCAT('[3][Wollen Sie die Datei |',zu_loeschen,' |wirklich löschen ? ][ Ja |Nein]',CHR(0));
- FORM_ALERT(1,alert[1]); (* Sicherheitsabfrage ob Datei gelöscht werden soll *)
- antwort := AESret;
- IF antwort = 1 (* Wirklich löschen *)
- THEN BEGIN
- ASSIGN(datei,zu_loeschen); (* Wenn 'Ja' dann löschen *)
- ERASE(datei);
- END;
- END;
- END;
-
-
- PROCEDURE starten; (* Externes Programm starten *)
- VAR
- start_file : STRING136;
- fehler : STRING136;
- alert : STRING136;
- geklappt : BOOLEAN;
- datei : TEXT;
- return_code : INTEGER;
- BEGIN
- get_filename(path_start,start_file,geklappt);
- IF geklappt
- THEN BEGIN
- V_CLRWK(gem_handle); (* Bildschirm löschen *)
- V_CURHOME(gem_handle); (* Cursor Home *)
- EXECPROG(start_file,return_code); (* Programm starten *)
- IF return_code <> 0 (* Fehlercode *)
- THEN BEGIN
- STR(return_code,fehler);
- alert := CONCAT('[3][Fehlercode ',fehler,' | in ',start_file,' ][ OK ]',CHR(0));
- FORM_ALERT(1,alert[1]); (* Meldung ausgeben *)
- END;
- bildschirm;
- END;
- END;
-
-
- PROCEDURE desktop; (* Abfrage ob Programm beendet *)
- VAR
- alert : STRING; (* Für Alert-Box *)
- i : INTEGER;
- BEGIN
- alert := CONCAT('[3][Wollen Sie das Programm| | verlassen ?][ Ja |Nein]',CHR(0));
- FORM_ALERT(1,alert[1]); (* Alert-Box ausgeben *)
- aes_antwort := AESret; (* Antwort der Alert-Box holen *)
-
- IF (aes_antwort = 1) (* Programm beenden wurde gewählt *)
- THEN BEGIN
- RSRC_FREE; (* Speicher des RSC-Files freigeben *)
- close_v_work; (* GEM-Programm schlie₧en *)
- END;
- END;
-
-
- PROCEDURE mache_programm(compilieren, (* Flag für Compilierung *)
- linken : BOOLEAN); (* Flag für Linken *)
- VAR
- start_datei,befehl,alert : STRING136;
- alt,neu : STRING136;
- datei : TEXT;
- geklappt : BOOLEAN;
- return_code,zwsp : INTEGER;
- i,laenge : INTEGER;
-
- BEGIN
- return_code := 0;
- geklappt := TRUE;
-
- IF compilieren AND vorhanden[1]
- THEN BEGIN (* Datei compilieren *)
- get_filename(path_compiler,start_datei,geklappt);
- IF geklappt
- THEN BEGIN
- GRAF_MOUSE(256,0); (* Hide mouse *)
- befehl := CONCAT(namen[1],start_datei);
- laenge := LENGTH(befehl);
- DELETE(befehl,laenge-3,4); (* '.PAS' löschen *)
- befehl := CONCAT(befehl,' .');
- V_CLRWK(gem_handle); (* Bildschirm löschen *)
- V_CURHOME(gem_handle); (* Cursor Home *)
- EXECPROG(befehl,return_code); (* Compiler starten *)
- IF return_code <> 0 (* Fehler aufgetreten *)
- THEN BEGIN
- GRAF_MOUSE(257,0); (* Show mouse *)
- bildschirm; (* Bildschirm wieder herrichten *)
- alert := CONCAT('[3][Fehler beim Compilieren !][Okay]',CHR(0));
- FORM_ALERT(1,alert[1]); (* Alert-Box ausgeben *)
- IF vorhanden[3]
- THEN BEGIN
- befehl := CONCAT(namen[3],start_datei);
- EXECPROG(befehl,zwsp); (* Editor aufrufen *)
- END
- ELSE fehlende_dateien(3);
- GRAF_MOUSE(256,0); (* Hide mouse *)
- END;
- GRAF_MOUSE(257,0); (* Show mouse *)
- bildschirm; (* Bildschirm wieder herrichten *)
- END;
- END
- ELSE BEGIN
- IF compilieren AND NOT vorhanden[1]
- THEN BEGIN
- fehlende_dateien(1);
- return_code := 127;
- END;
- END;
- (* Compilerteil beendet *)
-
- IF (linken AND geklappt AND (return_code = 0)
- AND vorhanden[2]) (* Datei linken *)
- THEN BEGIN
- IF not compilieren (* Neue Datei linken *)
- THEN BEGIN
- get_filename(path_link,start_datei,geklappt); (* Welche Datei denn ? *)
- END;
- IF geklappt
- THEN BEGIN
- GRAF_MOUSE(256,0); (* Hide mouse *)
- laenge := LENGTH(start_datei);
- DELETE(start_datei,laenge-3,4); (* '.BIN' entfernen *)
-
- IF gemprog (* Bei GEM-Programmen mit PASGEM linken *)
- THEN befehl := CONCAT(namen[2],start_datei,' PASGEM')
- ELSE befehl := CONCAT(namen[2],start_datei,' PAS');
-
- IF not map (* Keine Linkmap *)
- THEN befehl := CONCAT(befehl,' -NOLIST');
-
- V_CLRWK(gem_handle); (* Bildschirm löschen *)
- V_CURHOME(gem_handle); (* Cursor Home *)
- EXECPROG(befehl,return_code); (* Linker starten *)
-
- IF return_code <> 0 (* Fehler aufgetreten *)
- THEN BEGIN
- GRAF_MOUSE(257,0); (* Show mouse *)
- befehl := CONCAT('[3][Achtung Fehler beim Linken !| ][Okay]',CHR(0));
- FORM_ALERT(1,befehl[1]);
- GRAF_MOUSE(256,0); (* Hide mouse *)
- END
- ELSE BEGIN
- IF not gemprog (* Aus GEM-Prg. ein TOS-Prg. machen *)
- THEN BEGIN
- alt := CONCAT(start_datei,'.PRG');
- neu := CONCAT(start_datei,'.TOS');
- ASSIGN(datei,alt);
- RENAME(datei,neu); (* Umbenennen *)
- END;
- END;
-
- GRAF_MOUSE(257,0); (* Show mouse *)
- bildschirm;
- END;
- END
- ELSE BEGIN
- IF linken AND NOT vorhanden[2]
- THEN fehlende_dateien(2);
- END;
- END;
-
-
- PROCEDURE edit; (* Editor aufrufen *)
- VAR
- geklappt : BOOLEAN;
- name : STRING136;
- dummy : INTEGER;
- BEGIN
- get_filename(path_editor,name,geklappt); (* Namen holen *)
- IF geklappt
- THEN BEGIN
- IF vorhanden[3]
- THEN BEGIN
- name := CONCAT(namen[3],name); (* Editor aufrufen *)
- EXECPROG(name,dummy);
- bildschirm; (* Bildschirm restaurieren *)
- END
- ELSE fehlende_dateien(3);
- END;
- END;
-
-
- PROCEDURE crossref; (* Crossreferenzlisting *)
- VAR
- geklappt : BOOLEAN;
- name,befehl : STRING136;
- dummy : INTEGER;
- BEGIN
- get_filename(path_compiler,name,geklappt); (* Namen holen *)
- IF geklappt
- THEN BEGIN
- IF vorhanden[4]
- THEN BEGIN
- GRAF_MOUSE(256,0); (* Hide Mouse *)
- V_CLRWK(gem_handle); (* Bildschirm löschen *)
- V_CURHOME(gem_handle); (* Cursor Home *)
- ASSIGN(output,'CROSS.OUT'); (* Output nach 'CROSS.OUT' *)
- REWRITE(output);
- ECHO(output,TRUE); (* Ausgabe nach 'CROSS.OUT' und Console *)
- befehl := CONCAT(namen[4],name); (* Befehlsstring für XREF.PRG *)
- EXECPROG(befehl,dummy); (* Programm aufrufen *)
- ECHO(output,FALSE); (* Ausgabe nur noch nach 'output' *)
- ASSIGN(output,'CON:'); (* Ausgabe zur Konsole *)
- REWRITE(output);
- GRAF_MOUSE(257,0); (* Zeige Mouse *)
- bildschirm; (* Bildschirm wieder herstellen *)
- END
- ELSE fehlende_dateien(4);
- END;
- END;
-
-
- (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *)
- (* Menüleiste überwachen *)
- (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *)
-
- PROCEDURE arbeiten; (* Auf Mouseclick warten und Aufgaben verteilen *)
- VAR
- msg_buf : ARRAY[0..7] OF message_buffer_type; (* Buffer für Mouseclick *)
- ok : BOOLEAN;
- dummy : INTEGER;
- BEGIN
- evnt_mesag(msg_buf[0]); (* Auf Mouseclick warten *)
-
- IF (msg_buf[0] = 10) (* Click in Menüleiste *)
- THEN BEGIN
- CASE (msg_buf[3]) OF (* Was wurde gewählt ? *)
- M1: BEGIN (* Menüpkt 1 *)
- info_zeigen; (* Infotext ausgeben *)
- END;
-
- M2: BEGIN (* Menüpkt 2 *)
- CASE (msg_buf[4]) OF (* Weitere Unterscheidungen *)
- NEU_NAME: BEGIN (* Datei umbenennen *)
- umbenennen;
- END;
-
- LOESCHEN: BEGIN (* Datei löschen *)
- datei_loeschen;
- END;
-
- START: BEGIN (* Programm starten *)
- starten;
- END;
-
- EXIT : desktop; (* Shell verlassen *)
- END; (* CASE msg_buf[4] *)
- END; (* Ende von Menüpkt 2 *)
-
- M3: BEGIN (* Menüpkt 3 *)
- CASE (msg_buf[4]) OF
- COMPILER : BEGIN (* Übersetzen *)
- mache_programm(TRUE,FALSE);
- (* Datei übersetzen, aber nicht linken *)
- END;
-
- LINKER : BEGIN
- mache_programm(FALSE,TRUE);
- (* Datei linken, aber nicht übersetzen *)
- END;
-
- EDITOR : BEGIN
- edit; (* Editor aufrufen *)
- END;
-
- CROSS : BEGIN
- crossref; (* Jetzt Crossrefernzlisting *)
- END;
-
- MAKE : BEGIN
- mache_programm(TRUE,TRUE);
- (* Datei übersetzen und compilieren *)
- END;
- END; (* CASE msg_buf[4] *)
- END; (* Ende von Menüpkt 3 *)
-
- M4: BEGIN (* Menüpkt 4 *)
- CASE (msg_buf[4]) OF
- GEM_PRG : BEGIN
- gemprog := not gemprog;
- MENU_ICHECK(menue_addr,GEM_PRG,gemprog);
- END;
-
- COMP_OP : BEGIN
- V_CLRWK(gem_handle); (* Bildschirm löschen *)
- GRAF_MOUSE(256,0);
- V_ENTER_CUR(gem_handle); (* Textmodus *)
- V_CURHOME(gem_handle); (* Cursor Home *)
- IF vorhanden[5]
- THEN EXECPROG(namen[5],dummy)
- ELSE fehlende_dateien(5);
- V_EXIT_CUR(gem_handle); (* Grafikmodus *)
- GRAF_MOUSE(257,0);
- bildschirm;
- END;
-
- LINKMAP : BEGIN
- map := not map;
- MENU_ICHECK(menue_addr,LINKMAP,map);
- END;
- END; (* CASE msg_buf[4] *)
- END; (* Ende von M4 *)
- END;
- END;
- MENU_TNORMAL(menue_addr,msg_buf[3],TRUE); (* Menüleiste normal darstellen *)
- END;
-
-
- (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *)
- (* Hauptprogramm *)
- (* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *)
- BEGIN
- open_v_work; (* Startup für GEM-Programme *)
- lade_resource; (* Resourcefile laden,Adressen berechnen *)
- GRAF_MOUSE(0,0); (* Mouse als Pfeil *)
- set_path; (* Pathvariablen initalisieren *)
- lade_namen; (* Namen der Programme initalisieren *)
- gemprog := TRUE; (* Default ist GEM-Programm *)
- map := FALSE; (* Default ist keine Linkmap *)
-
- FOR i := 1 TO 80 DO
- leer_filename[i] := CHR(0); (* Leerer String für GEM *)
-
-
- WHILE(TRUE) DO (* Ende nur mit 'DESKTOP' *)
- BEGIN
- arbeiten; (* Menüleiste überwachen *)
- END;
-
- END.
-