home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / UTILITY / EXECMOD.M < prev    next >
Encoding:
Text File  |  1991-05-23  |  18.9 KB  |  464 lines

  1. MODULE ExecMod;
  2.  
  3. (*
  4.         Dieses Modul muß gelinkt werden. Dann erlaubt es, vom
  5.         Desktop aus Module (Endung '.MOD') direkt zu starten,
  6.         indem sie mit einem Doppelklick angewählt werden.
  7.  
  8.         So wird's gemacht:
  9.         Dieses Modul compilieren, dann in Linker-Optionen nur die
  10.         Module 'M2INIT' und 'GEMIO' aktivieren und dies Modul linken
  11.         (Vorsicht: Unbedingt KEINE Optimierung im Linker einstellen!).
  12.         Dann die Shell verlassen, im Desktop das Fenster mit der
  13.         erzeugten Prg-Datei (EXECMOD.PRG) öffnen und die Datei einmal
  14.         anklicken. Dann oben in der Menüzeile 'Anwendung anmelden'
  15.         anwählen. Es erscheint eine Box, in der als Dateiart 'MOD'
  16.         einzugeben ist. Zuletzt muß noch 'OK' angeklickt werden (nicht
  17.         RETURN drücken !). Nun kann eine beliebige MOD-Datei doppelt
  18.         angeklickt werden, wodurch automatisch 'EXECMOD.PRG' gestar-
  19.         tet wird, welches wiederum mit 'CallModule' (s.u.) das an-
  20.         geklickte Modul startet. Werden noch weitere Module benötigt,
  21.         werden sie in zwei weiteren Verzeichnissen gesucht: Dort, woher
  22.         das angelickte Modul stammt, und im Ordner "IMP" des darüber
  23.         liegenden Verzeichnisses (s. 'initPaths').
  24.         Bei Bedarf können die Suchpfade unten in der Prozedur
  25.         'initPaths' geändert werden, um z.B. die Module immer aus
  26.         einem Ordner auf einem festgelegten Laufwerk suchen zu lassen.
  27.         Wird ein Modul nicht gefunden, erscheint eine Fehlermeldung.
  28.  
  29.         Um den automatischen Aufruf dieses Programms beim Anklik-
  30.         ken von Modulen dauerhaft zu machen, muß in der Menüzeile
  31.         des Desktops 'Arbeit sichern' angewählt werden.
  32.  
  33.         Dieses Programm sorgt dafür, daß bei Bedarf die Ausgabe
  34.         über InOut auf ein Textfenster erfolgt.
  35.         Um Speicherplatz zu sparen, ist es auch möglich, von
  36.         diesem Programm eine Version zu erstellen, die anstatt
  37.         'GEMIO' das Modul 'TOSIO' verwendet. Dann werden die Aus-
  38.         gaben auf den normalen TOS-Bildschirm (ohne Grafik) ge-
  39.         leitet. Die so aktivierten Module sollten dann aber, wie
  40.         auch unter der Shell, die Endung 'MOS' statt 'MOD' erhal-
  41.         ten und entsprechend dieses modifizierte Programm bei
  42.         'Anwendung anmelden' für 'MOS'-Endungen installiert wer-
  43.         den.
  44.  
  45.         Achtung: Keinesfalls darf dieses Modul beim Linken kom-
  46.         primiert werden (unbenutzte Funktionen entfernen), da
  47.         sonst die hier eingelinkten Module nicht mehr vom anderen
  48.         Modul verwendet werden können.
  49.  
  50.         Ersteller: Thomas Tempelmann, 14.3.88
  51.         Für Megamax Modula-2
  52. *)
  53.  
  54. FROM SYSTEM IMPORT LONGWORD, WORD, ADDRESS, BYTE, ADR, ASSEMBLER;
  55.  
  56. FROM GEMEnv IMPORT RC, DeviceHandle, InitGem;
  57.  
  58. FROM SysBuffers IMPORT HdlErrorStack;
  59.  
  60. FROM Loader IMPORT LoaderResults, CallModule;
  61.  
  62. FROM Storage IMPORT ALLOCATE;
  63.  
  64. FROM SystemError IMPORT OutOfMemory;
  65.  
  66. FROM ArgCV IMPORT InitArgCV, PtrArgStr;
  67.  
  68. IMPORT Lists;
  69.  
  70. FROM PrgCtrl IMPORT TermProcess;
  71.  
  72. FROM SysCtrl IMPORT ExcToScanAddr;
  73.  
  74. FROM AESForms IMPORT FormAlert;
  75.  
  76. FROM EasyGEM0 IMPORT WrapAlert;
  77.  
  78. IMPORT MOSGlobals, Strings, SysTypes, FileBase, StrConv,
  79.         HdlError, ErrBase, MOSConfig, GEMScan;
  80.  
  81.  
  82. MODULE simpleGEMError;  (* lokales Modul *)
  83. (*$R-,S-*)
  84.  
  85.   (*
  86.    * Hilfsmodul zum Abfangen und Anzeigen von Laufzeitfehlern.
  87.    * Gegenüber GEMError wird kein Scanning ermöglicht und bei Dateifehlern
  88.    * wird nur die Fehlernummer angezeigt.
  89.    * Die Fehlertextvariablen werden mit deutschen Texten initialisiert.
  90.    *)
  91.   
  92.   IMPORT MOSGlobals;
  93.   
  94.   IMPORT ASSEMBLER, LONGWORD, WORD, ADDRESS, BYTE, ADR;
  95.   
  96.   FROM MOSGlobals IMPORT MEM, BusFault, OddBusAddr, NoValidRETURN, OutOfStack;
  97.   
  98.   IMPORT WrapAlert, FormAlert;
  99.   
  100.   IMPORT ALLOCATE, OutOfMemory;
  101.   
  102.   FROM Strings IMPORT String, Pos, Delete, Assign, Insert, Concat, Copy,
  103.         Length, Empty, Space, Append, Upper;
  104.   
  105.   FROM SysTypes IMPORT ScanDesc;
  106.   
  107.   FROM FileBase IMPORT CloseFile, HandleError, File0;
  108.   
  109.   FROM StrConv IMPORT CardToStr, StrToLCard, IntToStr, LHexToStr;
  110.   
  111.   IMPORT TermProcess;
  112.   
  113.   FROM SysTypes IMPORT ExcDesc;
  114.   
  115.   FROM HdlError IMPORT GetErrorMsg, CatchErrors;
  116.   
  117.   FROM ErrBase IMPORT RtnCond, ErrResp;
  118.   
  119.   FROM MOSConfig IMPORT LoaderMsg, FileErrMsg, RuntimeErrMsg;
  120.   
  121.   FROM GEMScan IMPORT InputScan, InitChain, CallingChain;
  122.   
  123.   IMPORT HdlErrorStack;
  124.   IMPORT ExcToScanAddr;
  125.   
  126.   
  127.   (* Folgende Funktion fängt allgemeine Laufzeitfehler ab. *)
  128.   
  129.   PROCEDURE bye(nr: INTEGER; msg: ARRAY OF CHAR; causer: ErrResp;
  130.                 cont: RtnCond; VAR info: ExcDesc): BOOLEAN;
  131.     
  132.     VAR scan: ScanDesc;
  133.         msg2: String;
  134.         msg1:ARRAY [0..133] OF CHAR; (* reicht f. 4 Zeilen *)
  135.         mayCont,
  136.         strVal:BOOLEAN;
  137.         defBut, index, button:CARDINAL;
  138.         relad:LONGCARD;
  139.         str,
  140.         mname:ARRAY [0..31] OF CHAR;
  141.     BEGIN
  142.       IF Empty (msg) THEN
  143.         GetErrorMsg (nr,str)
  144.       ELSE
  145.         Assign (msg,str,strVal)
  146.       END;
  147.       (* Scanner-Record vorbereiten: *)
  148.       ExcToScanAddr (info, scan);
  149.       IF causer=callerCaused THEN
  150.         index:= 1
  151.       ELSE
  152.         index:= 0
  153.       END;
  154.       mayCont:= cont=mayContinue;
  155.       IF (nr=BusFault) OR (nr=OddBusAddr) THEN
  156.         Concat (str,'| auf ',msg2,strVal);
  157.         Append (LHexToStr(info.accessAddr,0),msg2,strVal)
  158.       ELSE
  159.         Assign (str,msg2,strVal)
  160.       END;
  161.       InitChain (scan);
  162.       InputScan (msg2,index);
  163.       msg1:= '[0][][Quit';
  164.       IF mayCont THEN
  165.         Append ('|Cont',msg1,strVal)
  166.       END;
  167.       Append (']',msg1,strVal);
  168.       Append ( Space (22 - INTEGER (Length (str))), msg2, strVal);
  169.       Insert (msg2,4,msg1,strVal);
  170.       FormAlert (1+ORD(mayCont), msg1, button);
  171.       IF button = 1 THEN (* Quit *)
  172.         TermProcess (nr)
  173.       ELSE (* Cont *)
  174.         RETURN FALSE
  175.       END
  176.     END bye;
  177.   
  178.   
  179.   (* Folgende Prozedur fängt Dateifehler ab. *)
  180.   
  181.   PROCEDURE handleError0 (VAR f: File0; errNo: INTEGER; scan: ScanDesc);
  182.     VAR index,retBut:CARDINAL;
  183.         strVal:BOOLEAN;
  184.         name: ARRAY [0..23] OF CHAR;
  185.         str: ARRAY [0..31] OF CHAR;
  186.         msg:ARRAY [0..99] OF CHAR;
  187.     BEGIN
  188.       InitChain (scan);
  189.       Concat ('Dateifehler ', IntToStr (errNo, 0), msg, strVal);
  190.       WrapAlert (msg, 0);
  191.       index:= 1;
  192.       InputScan (msg,index);
  193.       Insert ("[3][",0,msg,strVal);
  194.       Append ("][Quit|Cont]",msg,strVal);
  195.       FormAlert (2, msg, retBut);
  196.       IF retBut = 1 THEN
  197.         TermProcess (MOSGlobals.FileSystemErr)
  198.       ELSE
  199.         (* Fehler ignorieren *)
  200.       END
  201.     END handleError0;
  202.   
  203.   
  204.   (* Folgende Prozedur dient als Datenfeld mit allen Dateifehlertexten. *)
  205.   
  206.   PROCEDURE fileMessages;
  207.     (*$L- : keinen Eingangscode erzeugen. *)
  208.     BEGIN
  209.       ASSEMBLER
  210.           DC.W    32767  ; default für undefinierte positive Fehlernummern:
  211.                           ACZ 'Undefinierte Warnung: @'  ASC '        '
  212.           DC.W    MOSGlobals.fNotDeleted
  213.                           ACZ 'Datei war nicht vorhanden'  ASC '      '
  214.           DC.W    MOSGlobals.fWasNotOpen
  215.                           ACZ 'Datei war nicht geöffnet'  ASC '       '
  216.           DC.W    MOSGlobals.fEOF
  217.                           ACZ 'Dateiende erreicht'  ASC '             '
  218.           DC.W    MOSGlobals.fEOL
  219.                           ACZ 'Zeilenende erreicht'  ASC '            '
  220.           DC.W    MOSGlobals.fOK
  221.                           ACZ 'Kein Fehler'  ASC '                    '
  222.           DC.W    MOSGlobals.fError
  223.                           ACZ 'Allgemeiner Fehler'  ASC '             '
  224.           DC.W    MOSGlobals.fDriveNotReady
  225.                           ACZ 'Laufwerk nicht ansprechbar'  ASC '     '
  226.           DC.W    MOSGlobals.fUnknownCmd
  227.                           ACZ 'Unbekannte Funktion'  ASC '            '
  228.           DC.W    MOSGlobals.fCRCError
  229.                           ACZ 'Prüfsummenfehler'  ASC '               '
  230.           DC.W    MOSGlobals.fBadRequest
  231.                           ACZ 'Unerlaubte Funktion'  ASC '            '
  232.           DC.W    MOSGlobals.fSeekError
  233.                           ACZ 'Disk defekt'  ASC '                    '
  234.           DC.W    MOSGlobals.fUnknownMedia
  235.                           ACZ 'Unbekanntes Disk-Format'  ASC '        '
  236.           DC.W    MOSGlobals.fSectorNotFound
  237.                           ACZ 'Sektor nicht vorhanden'  ASC '         '
  238.           DC.W    MOSGlobals.fNoPaper
  239.                           ACZ 'Drucker: Papierende'  ASC '            '
  240.           DC.W    MOSGlobals.fWriteFault
  241.                           ACZ 'Schreibfehler'  ASC '                  '
  242.           DC.W    MOSGlobals.fReadFault
  243.                           ACZ 'Lesefehler'  ASC '                     '
  244.           DC.W    MOSGlobals.fGenError
  245.                           ACZ 'Allgemeiner Disk-Fehler'  ASC '        '
  246.           DC.W    MOSGlobals.fWriteProtected
  247.                           ACZ 'Disk ist schreibgeschützt'  ASC '      '
  248.           DC.W    MOSGlobals.fMediaChanged
  249.                           ACZ 'Disk wurde gewechselt'  ASC '          '
  250.           DC.W    MOSGlobals.fUnknownDevice
  251.                           ACZ 'Unbekanntes Gerät'  ASC '              '
  252.           DC.W    MOSGlobals.fBadSectorsOnFormat
  253.                           ACZ 'Fehlerhafte Sektoren'  ASC '           '
  254.           DC.W    MOSGlobals.fInsertOtherDisk
  255.                           ACZ 'Disk wechseln (A<->B)'  ASC '          '
  256.           DC.W    MOSGlobals.fInvalidFunctionNr
  257.                           ACZ 'Unerlaubte Funktionsnummer'  ASC '     '
  258.           DC.W    MOSGlobals.fFileNotFound
  259.                           ACZ 'Datei existiert nicht'  ASC '          '
  260.           DC.W    MOSGlobals.fPathNotFound
  261.                           ACZ 'Directory existiert nicht'  ASC '      '
  262.           DC.W    MOSGlobals.fTooManyOpen
  263.                           ACZ 'Zu viele Dateien offen'  ASC '         '
  264.           DC.W    MOSGlobals.fAccessDenied
  265.                           ACZ 'Zugriff verwehrt'  ASC '               '
  266.           DC.W    MOSGlobals.fInvalidHandle
  267.                           ACZ 'Unerlaubte Zugriffskennung'  ASC '     '
  268.           DC.W    MOSGlobals.fInsufficientMemory
  269.                           ACZ 'Zu wenig Speicher'  ASC '              '
  270.           DC.W    MOSGlobals.fInvalidMemBlkAddr
  271.                           ACZ 'Speicherblock existiert nicht'  ASC '  '
  272.           DC.W    MOSGlobals.fInvalidDrive
  273.                           ACZ 'Unerlaubtes Laufwerk'  ASC '           '
  274.           DC.W    MOSGlobals.fDiffDrives
  275.                           ACZ 'Rename: verschiedene Laufwerke'  ASC ' '
  276.           DC.W    MOSGlobals.fNoMoreFiles
  277.                           ACZ 'Keine weiteren Dateien'  ASC '         '
  278.           DC.W    MOSGlobals.fRangeError
  279.                           ACZ 'Bereichsüberschreitung'  ASC '         '
  280.           DC.W    MOSGlobals.fInternalError
  281.                           ACZ 'Interner Fehler'  ASC '                '
  282.           DC.W    MOSGlobals.fBadFormatOfPrg
  283.                           ACZ 'Programmdatei defekt'  ASC '           '
  284.           DC.W    MOSGlobals.fResizeFailure
  285.                           ACZ 'Speicherblock nicht vergrößbar'  ASC ' '
  286.           DC.W    MOSGlobals.fOutOfMem
  287.                           ACZ 'Zu wenig Speicher'  ASC '              '
  288.           DC.W    MOSGlobals.fFileExists
  289.                           ACZ 'Datei existiert schon'  ASC '          '
  290.           DC.W    MOSGlobals.fNoReadAllowed
  291.                           ACZ 'Lesezugriff nicht erlaubt'  ASC '      '
  292.           DC.W    MOSGlobals.fFileNotClosed
  293.                           ACZ 'Datei noch offen'  ASC '               '
  294.           DC.W    MOSGlobals.fFileNotOpen
  295.                           ACZ 'Datei nicht offen'  ASC '              '
  296.           DC.W    MOSGlobals.fInternalErr1
  297.                           ACZ 'Interner Fehler (Pos>Length)'  ASC '   '
  298.           DC.W    MOSGlobals.fInternalErr2
  299.                           ACZ 'Interner Fehler (2)'  ASC '            '
  300.           DC.W    MOSGlobals.fBadOp
  301.                           ACZ 'Zugriff in falschem Modus'  ASC '      '
  302.           DC.W    MOSGlobals.fBadAccess
  303.                           ACZ 'Zugriff nicht erlaubt'  ASC '          '
  304.           DC.W    MOSGlobals.fEndOfFile
  305.                           ACZ 'Dateiende überschritten'  ASC '        '
  306.           DC.W    MOSGlobals.fDoubleUndo
  307.                           ACZ "Wiederholter 'UndoRead'-Aufruf"  ASC ' '
  308.           DC.W    MOSGlobals.fNameTooLarge
  309.                           ACZ 'Dateiname zu lang'  ASC '              '
  310.           DC.W    MOSGlobals.fDiskFull
  311.                           ACZ 'Disk ist voll'  ASC '                  '
  312.           DC.W    MOSGlobals.fIllegalCall
  313.                           ACZ 'Unerlaubter Funktionsaufruf'  ASC '    '
  314.           DC.W    -32768 ; default für undefinierte negative Fehlernummern:
  315.                           ACZ 'Undefinierter Fehler: @'  ASC '        '
  316.           
  317.           DC.W  0,0       ; Endekennzeichnung für die Liste
  318.       END
  319.     END fileMessages;
  320.     (*$L=*)
  321.   
  322.   
  323.   (* Folgende Prozedur dient als Datenfeld mit allen Laufzeitfehlertexten. *)
  324.   
  325.   PROCEDURE errMessages;
  326.     (*$L- : keinen Eingangscode erzeugen. *)
  327.     BEGIN
  328.       ASSEMBLER
  329.           DC.W  -32768  ; default für undefinierte Fehlernummern:
  330.                           ACZ 'Undefinierter Fehler: @'  ASC '        '
  331.   
  332.           DC.W    MOSGlobals.GeneralErr
  333.                           ACZ 'Genereller Fehler'  ASC '              '
  334.           DC.W    MOSGlobals.BusFault
  335.                           ACZ 'Adresse nicht ansprechbar'  ASC '      '
  336.           DC.W    MOSGlobals.OddBusAddr
  337.                           ACZ 'Zugriff auf ungerade Adresse'  ASC '   '
  338.           DC.W    MOSGlobals.IllegalInstr
  339.                           ACZ 'Unbekannte Maschinenanweisung'  ASC '  '
  340.           DC.W    MOSGlobals.DivByZero
  341.                           ACZ 'Division durch Null'  ASC '            '
  342.           DC.W    MOSGlobals.OutOfRange
  343.                           ACZ 'Bereichsüberschreitung'  ASC '         '
  344.           DC.W    MOSGlobals.Overflow
  345.                           ACZ 'Überlauf'  ASC '                       '
  346.           DC.W    MOSGlobals.StringOverflow
  347.                           ACZ 'String-Überlauf'  ASC '                '
  348.           DC.W    MOSGlobals.NoValidRETURN
  349.                           ACZ 'RETURN ohne gültiges Argument'  ASC '  '
  350.           DC.W    MOSGlobals.OutOfStack
  351.                           ACZ 'Stacküberlauf'  ASC '                  '
  352.           DC.W    MOSGlobals.HALTInstr
  353.                           ACZ 'HALT - Anweisung'  ASC '               '
  354.           DC.W    MOSGlobals.FileSystemErr
  355.                           ACZ 'Fehler im Dateisystem'  ASC '          '
  356.           DC.W    MOSGlobals.OutOfMemory
  357.                           ACZ 'Ungenügend freier Speicher'  ASC '     '
  358.           DC.W    MOSGlobals.IllegalCall
  359.                           ACZ 'Unerlaubter Funktionsaufruf'  ASC '    '
  360.           DC.W    MOSGlobals.CoroutineRtn
  361.                           ACZ 'Rückkehr aus Coroutine'  ASC '         '
  362.           DC.W    MOSGlobals.InternalFault
  363.                           ACZ 'Interner Fehler'  ASC '                '
  364.           DC.W    MOSGlobals.IllegalProcVar
  365.                           ACZ 'Undefinierte PROCEDURE-Var.'  ASC '    '
  366.           DC.W    MOSGlobals.IllegalPointer
  367.                           ACZ 'Uninitialisierte POINTER-Var.'  ASC '  '
  368.           DC.W    MOSGlobals.UserBreak
  369.                           ACZ 'Abbruch durch den Anwender'  ASC '     '
  370.           DC.W    MOSGlobals.IllegalState
  371.                           ACZ 'Interner Statusfehler'  ASC '          '
  372.           DC.W    MOSGlobals.Exception
  373.                           ACZ 'Diverse Exception'  ASC '              '
  374.           DC.W    MOSGlobals.GenFPErr
  375.                           ACZ 'Allg. Floating-Point Fehler'  ASC '    '
  376.           DC.W    MOSGlobals.CaseSelectErr
  377.                           ACZ 'Unerfüllte CASE-Anweisung'  ASC '      '
  378.           DC.W    MOSGlobals.ConfigErr
  379.                           ACZ 'Fataler Konfigurationsfehler'  ASC '   '
  380.           DC.W    MOSGlobals.IllegalClosure
  381.                           ACZ 'Zuweisung lokaler Prozedur'  ASC '     '
  382.           DC.W    MOSGlobals.GemErr
  383.                           ACZ 'Fehler bei letztem GEM-Aufruf'  ASC '  '
  384.           DC.W  0,0       ; Endekennzeichnung für die Liste
  385.       END
  386.     END errMessages;
  387.     (*$L=*)
  388.   
  389.   
  390.   BEGIN
  391.     (* Abfangen aller Fehlermeldungen: *)
  392.     IF ~CatchErrors (bye, MEM(HdlErrorStack)) THEN OutOfMemory END;
  393.     HandleError:= handleError0;
  394.     FileErrMsg:= ADDRESS (fileMessages);
  395.     RuntimeErrMsg:= ADDRESS (errMessages);
  396.     
  397.     NEW (LoaderMsg);
  398.     IF LoaderMsg = NIL THEN OutOfMemory END;
  399.     
  400.     (* Fehlertexte des Moduls 'Loader' in Deutsch: *)
  401.     LoaderMsg^[0]:=  '"@I" nicht vorhanden';
  402.     LoaderMsg^[1]:=  '"@I" beim Importieren in "@C" nicht gefunden';
  403.     LoaderMsg^[2]:=  '"@I" ist defekt';
  404.     LoaderMsg^[3]:=  'Unerlaubte Daten in "@I"';
  405.     LoaderMsg^[4]:=  'Unerlaubtes Layout von "@I"';
  406.     LoaderMsg^[5]:=  'Versionskonflikt zwischen "@I" und "@C"';
  407.     LoaderMsg^[6]:=  'Kein ausreichender Speicherplatz mehr';
  408.     LoaderMsg^[7]:=  '"@I" ist resident und schon initialisiert';
  409.     LoaderMsg^[8]:=  'Unerlaubter Modulname';
  410.     LoaderMsg^[9]:=  'Zu viele verschachtelte Modulaufrufe';
  411.     LoaderMsg^[10]:= 'Programm ist nicht ausführbar';
  412.     LoaderMsg^[11]:= 'Programm nicht gefunden';
  413.     LoaderMsg^[12]:= 'Laufzeitfehler während Initialisierung';
  414.     LoaderMsg^[13]:= 'Laufzeitfehler während Deinitialisierung';
  415.     LoaderMsg^[14]:= '"@I" ist komprimiert';
  416.     LoaderMsg^[15]:= '"@I" hat falsches Real-Format';
  417.     LoaderMsg^[16]:= '"@I": FPU nicht vorhanden';
  418.     LoaderMsg^[17]:= 'Zu viele Module zu initialisieren';
  419.   END simpleGEMError;  (* lokales Modul *)
  420. (*$R=*)
  421.  
  422.  
  423. VAR     pathArray: ARRAY [0..1] OF ARRAY [0..64] OF CHAR; (* global ! *)
  424.         paths: Lists.List;
  425.  
  426. PROCEDURE initPaths;
  427.   VAR err: BOOLEAN;
  428.   BEGIN
  429.     Lists.CreateList (paths,err);
  430.     pathArray [0]:= '*\';           (* Aktueller Pfad *)
  431.     pathArray [1]:= '*\..\IMP\';    (* Subdirectory "IMP" im Vorverzeichnis *)
  432.     Lists.AppendEntry (paths,ADR(pathArray[0]),err);
  433.     Lists.AppendEntry (paths,ADR(pathArray[1]),err);
  434.   END initPaths;
  435.  
  436.  
  437. VAR argc: CARDINAL;
  438.     argv: ARRAY [0..1] OF PtrArgStr;
  439.     exitcode: INTEGER;
  440.     msg: ARRAY [0..99] OF CHAR;
  441.     res: LoaderResults;
  442.     button: CARDINAL;
  443.     ok: BOOLEAN;
  444.     devHdl: DeviceHandle;
  445.  
  446. BEGIN
  447.   InitGem (RC, devHdl, ok);
  448.   IF ok THEN
  449.     initPaths;                    (* Suchpfade für importierte Module setzen *)
  450.     InitArgCV (argc, argv);         (* Name der angeklickten Datei ermitteln *)
  451.     CallModule (argv[1]^, paths, '', NIL, exitcode, msg, res);
  452.     IF res # noError THEN
  453.       WrapAlert (msg, 0);
  454.       Strings.Insert ('[0][', 0, msg, ok);
  455.       Strings.Append ('][OK]', msg, ok);
  456.       FormAlert (1, msg, button);
  457.       exitcode:= -1
  458.     END;
  459.     TermProcess (exitcode)
  460.   ELSE
  461.     TermProcess (-39) (* out of memory *)
  462.   END
  463. END ExecMod.
  464.