home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 06_07 / link / makecall.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-04-05  |  3.2 KB  |  76 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     MAKECALL.PAS                       *)
  3. (* Das Programm erzeugt für ein beliebiges FORTRAN-Unter- *)
  4. (* programm "xyz" ein ausführbares Programm "Cxyz.EXE",   *)
  5. (* das die benötigten Parameter aus einer temporären Da-  *)
  6. (* tei TEMPIN lieset und in TEMPOUT die Ergebnisse        *)
  7. (* schreibt. Das Programm kann von DOS oder mit Exec auf- *)
  8. (* gerufen werden.                                        *)
  9. (*  (c) 1988 by Jörg Stein & PASCAL International         *)
  10. (* ------------------------------------------------------ *)
  11. PROGRAM MakeCall;
  12. {$M 3072,0,3072}   (* Die Option reserviert Speicherplatz *)
  13.                    (* für FORTRAN-Compiler und den Linker *)
  14. USES Dos;
  15.  
  16. CONST DOS_Path        = 'C:\SYS\';
  17.       Profort_Path    = 'C:\FORTRAN\';
  18.       Profort_Lib     = 'C:\FORTRAN\LIB\PROFORT';
  19.  
  20. VAR   i,j             : INTEGER;
  21.       InFile, OutFile : TEXT;
  22.       SubName, Zeile,
  23.       Param, Syntax,
  24.       Objects, Library: STRING;
  25.  
  26. BEGIN
  27.   IF ParamCount = 0 THEN BEGIN
  28.     WriteLn('Kein Parameter übergeben'); Exit;
  29.   END;
  30.   Syntax := ParamStr(1);
  31. (* In den Syntax-String wird nach jedem Parameter die in  *)
  32. (* Klammern stehende Nummer des betreffenden Parameters   *)
  33. (* eingefügt. dadurch entsteht die von Cxyz.EXE benötigte *)
  34. (* Syntax.                                                *)
  35.   i := -3; j := 49;
  36.   REPEAT
  37.     i := Pos(',',Copy(Syntax,i+4,Length(Syntax)-i-3));
  38.     IF i>0 THEN Syntax := Copy(Syntax,1,i-1)+'('+Chr(j)+')'
  39.                 +Copy(Syntax,i,Length(Syntax)-(i-1))
  40.     ELSE Syntax := Copy(Syntax,1,Length(Syntax)-1)+'('+
  41.                 Chr(j)+'))';
  42.     j := j + 1;
  43.   UNTIL i = 0;
  44.                      (* Unterprogramm-Namen feststellen *)
  45.   SubName := Copy(Syntax,1,Pos('(',Syntax)-1);
  46.   (* Liste der benötigten OBJ und LIB-Dateien erstellen *)
  47.   Objects := 'C'+SubName; Library := Profort_Lib;
  48.   FOR i := 2 TO ParamCount DO
  49.     IF Copy(ParamStr(i),1,2) = '/O' THEN
  50.       Objects := Objects+'+'+Copy(ParamStr(i),3,
  51.                                    Length(ParamStr(i))-2);
  52.   IF Copy(ParamStr(i),1,2) = '/L' THEN
  53.     Library := Copy(ParamStr(i),3,Length(ParamStr(i))-2)
  54.                  +'+'+Library;
  55.       (* Modifizieren der FORTRAN-Source des aufrufenden *)
  56.       (* Programms und abspeichern des aktuellen aufru-  *)
  57.       (* fenden Programms in Cxyz.FOR                    *)
  58.   Assign(InFile,Profort_Path+'CALLER.FOR'); ReSet(InFile);
  59.   Assign(OutFile,'C'+SubName+'.FOR'); ReWrite(OutFile);
  60.   FOR i := 1 TO 21 DO BEGIN
  61.     ReadLn(InFile, Zeile); WriteLn(OutFile, Zeile);
  62.   END;
  63.   ReadLn(InFile); WriteLn(OutFile,'       CALL '+Syntax);
  64.   FOR i := 1 TO 12 DO BEGIN
  65.     ReadLn(InFile, Zeile); WriteLn(OutFile, Zeile);
  66.   END;
  67.   Close(InFile);  Close(OutFile);
  68.            (* Aufruf des Professional-FORTRAN-Compilers *)
  69.   Exec(Profort_Path+'PROFORT.EXE','C'+SubName);
  70.   IF DosExitCode = 0 THEN BEGIN     (* Compilation okay *)
  71.     Exec(DOS_Path+'LINK.EXE',Objects+',,,'+Library);
  72.     IF DosExitCode=0 THEN WriteLn('Aufrufprogramm erzeugt')
  73.     ELSE WriteLn('Fehler beim Linken.'); END
  74.   ELSE WriteLn('Fehler beim Compilieren');
  75. END.
  76.