Waldek Hebisch wrote:
D. Wood wrote:
I produced the attached document when converting a large DEC Pascal simulation to gpc (under Linux) some years ago. We can still run our code on both VMS and gpc. I think it should help get round most issues you may come across.
It leaves a fair bit of manual editing but by adopting a conversion checklist, the manual process is straightforward.
A little nitpick: in principle GPC should run on VMS. So when you write `Linux REAL defaults to DOUBLE.' it should be `GPC REAL defaults to DOUBLE.' (even on VMS GPC would use DOUBLE as REAL). The same in few other places.
Indeed. I haven't seen anything Linux specific in the document (with one unnecessary exception, see below), so such names suggest an unnecessary system restriction.
Second remak: GPC supports conditional compilation, macros and include files. Using those features you should be able to avoid extra preprocessing (I assume that DEC Pascal treats {$...} construct as a comment).
Yes -- this should avoid conversion scripts and make it easier to work on a single source base.
Some other points:
: Add a space between unformatted integers in a write statement. : GNU Pascal doesn't assume a default field width for integers so they : merge when output.
The `field-widths' directive/option can change this.
: In modules, make global string definitions local. If required by global : routines within the module, pass them as parameters. Alternatively, avoid : the need to use global string variables defined within a module. : A bug in GNU Pascal means that strings defined globally by a module : can unexpectedly become unassignable (ie. they maintain a null : length even when assigned a value).
This bug has long been fixed meanwhile, BTW.
: {*V*} a:= ZERO; {*V*} a : array [1..3] of double:= ZERO; : : : {*L*} zero(a); {*L*} a : array [1..3] of double:= (0,0,0); : : DEC Pascal can use this assignment to zero/null records and arrays : in declaration sections as well as in the main body of the code. : Through <os_linux.h> , zero(a) is mapped to DEC_zero(a, : sizeof(a)), a procedure defined in unit OS_linux which clears : memory at the address of parameter a. However this cannot be used : to replace :=ZERO in the declaration section. Small arrays can be : zeroed with 0's. e.g. for a 3-component array of reals, use := : (0,0,0) and for complex components use :=( (0,0), (0,0), (0,0) : ). Large arrays must be initialised in the body of the code with : zero(a).
Recently (since 20041017) GPC supports EP initializers which can be written independent of the array size:
var a : array [1..3] of double value [otherwise 0];
: Replace SYS$OUTPUT with /dev/stdout. : Replace SYS$INPUT with /dev/stdin.
Actually better replace both with '-' or '' (empty string). These are recognized as standard input/output by GPC (dependent on whether the file is opened for reading or writing). Whereas `/dev/stdout' etc. are just symlinks on Linux (and perhaps other Unix compatbile systems), and probably don't work elsewhere.
: {$define uint cardinal}
Usually it's better to declare such things as types (i.e. `type uint = Cardinal;'). Defines are not scoped, so e.g. affect the use of such identifiers locally, or in record fields etc., sometimes leading to mysterious error messages.
Frank