PPU2O - Wandlung von bersetzten Pure Pascal Units in Pure C Objektfiles
========================================================================

Aufruf:

  PPU2O unit1.ppu [unit2.ppu ...]

wandelt die angegebenen Units in Objektfiles unit1.o ... um.
Gewandelt wird immer in Pure C Objektformat, Umwandlung in DRI-Format
ist nicht mglich.


Optionen:

  (noch) keine.


PPU2O erlaubt es, Pure Pascal Programmteile von C oder Assemblerhaupt-
programmen aus aufzurufen.


Die Umwandlung durch PPU2O geschieht folgendermaen:

 - Namen, die im Interfaceteil der Unit deklariert wurden, werden
   im Objektfile global.

 - Namen, die im Implementierungsteil der Unit deklariert wurden,
   werden lokal.

 - Namen, die aus anderen Units verwendet wurden, werden extern.

 - Alle Namen werden bereits vom Pascal Compiler in Grobuchstaben
   gewandelt, aber sonst nicht verndert. Wenn gleichlautende
   Namen in verschiedenen Units vorhanden sind, kann es also
   zu Mehrfachdefinitionen von Namen im Pure C Linker kommen,
   auch wenn fr den Pascal Linker alles in Ordnung ist.

 - Der Initialisierungsteil der Unit erhlt den Namen der Unit.
   Selbst wenn der Quelltext leer ist, enthlt der generierte Code
   Aufrufe zur Initialisierung der in USES-Klauseln aufgefhrten Units.
   Es empfiehlt sich daher, ihn beim Programmstart aufzurufen, falls
   der Pascalteil Routinen aus Bibliotheken bzw. anderen Units ver-
   wendet.


Auch die verwendeten Pure Pascal Bibliotheks-Units mssen mit PPU2O
gewandelt und hinzugebunden werden, damit der Linker keine undefinierten
Symbole meldet.


Sollen von Pascal aus C Routinen oder Variablen angesprochen werden,
so sollten diese fr Pascal in einer "Dummy"-Unit deklariert werden,
die selbst nicht gewandelt und hinzugebunden wird. Der Pascal-Compiler
erzeugt einen Aufruf auf den Initialisierungsteil dieser Unit, der
als C-Funktion vorhanden sein sollte, aber leer sein kann.


Da nun der Pure Pascal Startupcode nicht durchlaufen wird (sondern der
von C bzw. ein eigener), sind bestimmte Variable der Unit SYSTEM
nicht initialisiert und deshalb nicht benutzbar:

 - Variable AppFlag zur Unterscheidung von Accessories und Programmen
   ist nicht gesetzt.
 - Die Mechanismen zum Verlassen des Programms sind nicht initialisiert.
   Deshalb Programm ber die C-Mechanismen (exit() etc.) verlassen.
 - Die Kommandozeile ist nicht aufbereitet, deshalb sind die Funktionen
   ParamCount und ParamStr nicht verwendbar.
 - Variable BasePage ist nicht gesetzt.
 - Variable StackLimit ist nicht gesetzt, damit funktioniert die
   $S-Option (Stack overflow checking) nicht richtig und sollte
   ausgeschaltet werden.


Die Aufrufkonventionen von Pure Pascal sind weitgehend mit Pure C
vertrglich, in beiden Sprachen werden Parameter soweit wie mglich
in Registern bergeben. Bei der Deklaration von Pascalroutinen in C
ist somit NICHT das Schlsselwort 'pascal' anzugeben.

Nheres zu den Aufrufkonventionen und zur internen Darstellung von
Pure Pascal Datentypen im Handbuch ab Seite 244 oder im Help unter:
Pascal/Pure Pascal intern.


Hier ein einfaches Beispiel, in dem eine in Pascal geschriebene
Funktion von C aus aufgerufen wird.

Zunchst der Pascal Quelltext:

FAC_UNIT.PAS:
=========================================================================
Unit fac_unit;

interface

function fac( n : integer ) : integer;

implementation

function fac( n : integer ) : integer;
begin
  if n <= 0 then
    fac := 1
  else
    fac := fac( n - 1 ) * n;
end;

end.
=========================================================================


Hier das Hauptprogramm in C:

FAC_MAIN.C:
=========================================================================
#include	<stdio.h>

extern	void	FAC_UNIT(void);		/* Initialisierungsteil */
extern	int		FAC( int n );		/* function fac ...     */

main()
{
	int	fac5;

	FAC_UNIT();		/* Initialisiere die Unit */

	fac5 = FAC(5);  /* Aufruf der Funktion */

	printf("fac(5) = %d\n", fac5);

	return(0);
}
=========================================================================


Die Projektdatei fr Pure C:

=========================================================================
fac.prg
=
pcstart.o		; C-Startupcode
fac_main.c		; Hauptprogram in C
fac_unit.o		; Gewandelte Pascal Unit
system.o		; Gewandelte Pascal System Unit
pcstdlib.lib	; C-Standardbibliothek
=========================================================================


Zum Zusammenbauen mssen wir zunchst in Pure Pascal den Quelltext
FAC_UNIT.PAS in FAC_UNIT.PPU bersetzen.

Dann mssen FAC_UNIT.PPU und die System Unit SYSTEM.PPU in Pure C
Objektdateien gewandelt werden:

    PPU2O FAC_UNIT SYSTEM

Schlielich veranlassen wir in Pure C mit Make ... die bersetzung
von FAC_MAIN.C und das Linken des Programms.
