home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 2
/
FFMCD02.bin
/
new
/
dev
/
misc
/
p2c
/
src
/
p2c.cat
< prev
next >
Wrap
Text File
|
1993-12-21
|
84KB
|
1,365 lines
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
NNNNAAAAMMMMEEEE
p2c - Pascal to C translator, version 1.20
SSSSYYYYNNNNOOOOPPPPSSSSIIIISSSS
pppp2222cccc [ options ] [ file [ module ] ]
DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN
_P_2_c is a tool for translating Pascal programs into C. The
input consists of a set of source files in any of the
following Pascal dialects: HP Pascal, Turbo/UCSD Pascal, DEC
VAX Pascal, Oregon Software Pascal/2, Macintosh Programmer's
Workshop Pascal, Sun/Berkeley Pascal. Modula-2 syntax is
also supported. Output is a set of ....cccc and ....hhhh files that
comprise an equivalent program in any of several dialects of
C. Output code may be kept machine- and dialect-
independent, or it may be targeted to a specific machine and
compiler. Most reasonable Pascal programs are converted
into fully functional C which will compile and run with no
further modifications, although _p_2_c sometimes chooses to
generate readable code at the expense of absolute
generality. _P_2_c endeavors to insert notes and warning
messages into the output code to point out areas which may
require human intervention. Output code is arranged to be
readable and efficient, and to make use of C idioms wherever
possible. The main goal of the translation is to produce C
files which are pleasant and "natural" enough to be
acceptable as the new source files for a program. In a
pinch, _p_2_c will also serve as an ad hoc Pascal compiler.
Code generated by _p_2_c normally does not assume characters
are signed or unsigned. Also, it assumes iiiinnnntttt is the same as
either sssshhhhoooorrrrtttt or lllloooonnnngggg but does not depend on which. However,
if iiiinnnntttt is not the same as lllloooonnnngggg it is best to use a modern C
compiler which supports prototypes. Generated code does not
require an ANSI-compatible compiler (unless ANSI-style code
is requested), but it does use various ANSI-standard library
routines.
All generated code includes the file <_p_2_c/_p_2_c._h> which in
turn includes <_s_t_d_i_o._h> and various other common resources.
Also, many translated programs will need to be linked with
the run-time library, typically -_l_p_2_c.
Given a file name, _p_2_c reads from the specified file and
outputs to a file with a ....cccc suffix added or substituted.
For example,
p2c myfile.pas
reads from _m_y_f_i_l_e._p_a_s to produce the file _m_y_f_i_l_e._c. The
input file may contain a Pascal main program or a single
Pascal module (or "unit" in Turbo and UCSD Pascal
- 1 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
nomenclature), or it may just contain a number of procedures
and declarations. _P_2_c is designed to work for correct input
programs. That is, it will accept partial programs but may
occasionally core dump if the input refers to undefined
symbols.
If the input is a module, the translator will also produce a
file _m_o_d_u_l_e....hhhh containing a translation of the module's
interface section. The implementation section may be
omitted in which case only the ....hhhh file will be interesting.
If the program or module has include files, these may cause
additional ....cccc files to be generated depending on the value
of the EEEExxxxppppaaaannnnddddIIIInnnncccclllluuuuddddeeeessss option (see below).
If no file name is given, _p_2_c reads Pascal from the standard
input and writes the resulting C to standard output (though
a ....hhhh file may still be produced). If a file name and module
name are given, the file may include several modules (or
units). The specified module is translated; any others are
skipped. The output files will be named _m_o_d_u_l_e....cccc and
_m_o_d_u_l_e....hhhh. _P_2_c never translates more than one module per
run.
Before starting, _p_2_c reads the file /_u_s_r/_l_i_b/_p_2_c/_p_2_c_r_c for a
number of configuration parameters. (The actual path used
on your system may vary. The ----iiii option is a handy way to
examine this file.) If the P2CRC environment variable is
set, it gives the name of a file to read instead of the
system file; this file can start with IIIInnnncccclllluuuuddddeeee %%%%HHHH////pppp2222ccccrrrrcccc to
include the system file. Next, _p_2_c attempts to read the
file _p_2_c_r_c in your directory for further configuration. If
this file does not exist, _p_2_c looks for ._p_2_c_r_c instead.
OOOOPPPPTTTTIIIIOOOONNNNSSSS
----oooo _c_f_i_l_e
Use _c_f_i_l_e in place of _f_i_l_e....cccc or _m_o_d_u_l_e....cccc as the primary
output file. A single dash (`-o -') says to write the
C code to the standard output.
----hhhh _h_f_i_l_e
Use _h_f_i_l_e in place of _m_o_d_u_l_e....hhhh as the output file for
interface text. This only has effect if the input is
an HP Pascal module or a Turbo Pascal unit.
----ssss _s_f_i_l_e
Read interface text from _s_f_i_l_e before beginning the
translation. This file typically contains one or more
modules, often with interface sections omitted for
speed, which the program or module being translated
will use. (Typically the IIIImmmmppppoooorrrrttttFFFFrrrroooommmm and IIIImmmmppppoooorrrrttttDDDDiiiirrrr
parameters in _p_2_c_r_c are set up to allow _p_2_c to locate
interface text without needing any ----ssss options.) If
- 2 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
there are several ----ssss options in the command, the _s_f_i_l_e_s
are read from left to right.
----pppp_n Display progress of translation in the form of a line
number/file name display. This is refreshed every _n
lines, 25 by default.
----cccc _r_c_f_i_l_e
Read local configuration commands from _r_c_f_i_l_e instead
of _p_2_c_r_c or ._p_2_c_r_c. A dash (`-c -') in place of _r_c_f_i_l_e
causes no local configuration file to be used.
----vvvv ("Vanilla.") Do not read from the system configuration
file /_u_s_r/_l_i_b/_p_2_c/_p_2_c_r_c. Since some of the parameters
in this file are required, your local configuration
file must include those parameters instead. This also
suppresses the file named by the P2CRC environment
variable.
----HHHH _h_o_m_e_d_i_r
Use _h_o_m_e_d_i_r instead of /_u_s_r/_l_i_b/_p_2_c as the _p_2_c home
directory. The system _p_2_c_r_c file will be searched for
in this directory.
----IIII_p_a_t_t_e_r_n
Add _p_a_t_t_e_r_n to the IIIImmmmppppoooorrrrttttDDDDiiiirrrr search list of places to
find modules which are imported. The pattern should
include a %_s to represent the module name, and should
evaluate to a potential file name for that module's
source code. For example, ........////%%%%ssss....ppppaaaassss looks for
_m_o_d_u_l_e_n_a_m_e....ppppaaaassss in the parent of the current directory.
----iiii This special option (which must be the only argument on
the command line if used) simply copies the system
configuration file /_u_s_r/_l_i_b/_p_2_c/_p_2_c_r_c to the standard
output in its entirety. (It may be used with ----HHHH, but
----iiii is most useful precisely when you don't know the
location of the home directory.)
----qqqq Quiet mode. Suppresses output of status messages
during translation.
----EEEE_n Abort translation after _n errors. If _n is omitted it
defaults to zero, which means unlimited errors are
allowed. Use ----EEEE1111 to make _p_2_c halt after the first
error.
----eeee Echo the Pascal source into the output file, surrounded
by #ifdefs. This is the same as the CCCCooooppppyyyySSSSoooouuuurrrrcccceeee
parameter in the _p_2_c_r_c file.
----aaaa Produce modern ANSI C. This is a convenient override
- 3 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
for the AAAAnnnnssssiiiiCCCC parameter in the _p_2_c_r_c file.
----LLLL _l_a_n_g_u_a_g_e
Select input language name, such as VAX or TURBO. This
is a convenient override for the LLLLaaaannnngggguuuuaaaaggggeeee parameter.
----VVVV Verbose mode. This causes _p_2_c to generate an
additional ".log" file with further details of the
translation, such as a list of warnings and notes
including those which are suppressed in the regular
output.
----MMMM0000 Disable memory conservation. This prevents _p_2_c from
freeing various data structures after translating each
function, in case this new conservation feature causes
unforseen problems.
----RRRR Regression testing mode. Formats notes and warning
messages in a way that makes it easier to run _d_i_f_f(1)
on the output of _p_2_c.
_P_2_c also understands a few debugging options which may
occasionally be useful when tracking down translation
problems. The ----dddd_n option sets the "debug level" to _n, a
small integer which is normally zero. Debugging output is
written into the regular output file along with the C code;
the higher your _n, the more "wallpaper" you get. Also, ----tttt
prints debugging information at every Pascal token, ----BBBB_n
enables line-breaker debugging, and ----CCCC_n enables comment
placement debugging.
CCCCHHHHOOOOIIIICCCCEEEE OOOOFFFF SSSSOOOOUUUURRRRCCCCEEEE LLLLAAAANNNNGGGGUUUUAAAAGGGGEEEE
The LLLLaaaannnngggguuuuaaaaggggeeee configuration parameter or ----LLLL command-line
option tells _p_2_c which Pascal dialect to expect in the input
file. Any language features which do not overlap between
dialects are supported all of the time. The LLLLaaaannnngggguuuuaaaaggggeeee
parameter is consulted when a syntax or usage is detected
that has different meanings in two different dialects, and
also to determine default values for various other
translation parameters as described below.
The following language words are supported by _p_2_c. Names are
case-insensitive.
HHHHPPPP HP Pascal. This is the default language. All
features of HP Standard Pascal, the Pascal
Workstation version, are supported except as noted
in BUGS below. Some features of MODCAL, HP's
extended Pascal, are also supported. This is a
superset of ISO standard Pascal, including
conformant arrays and procedural parameters.
- 4 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
HHHHPPPP----UUUUXXXX HP Pascal, HP-UX version. Almost identical to the
"HP" dialect.
TTTTuuuurrrrbbbboooo Turbo Pascal 5.0 for the IBM PC. Few conflicts with
HP Pascal, so the LLLLaaaannnngggguuuuaaaaggggeeee parameter is not often
needed for Turbo. (Most important is that the Turbo
and HP dialects use 16 and 32 bit integers,
respectively.)
UUUUCCCCSSSSDDDD UCSD Pascal. Similar to Turbo in many ways.
MMMMPPPPWWWW Macintosh Programmer's Workshop Pascal 2.0. Should
also do a pretty good job for Lightspeed Pascal.
Object Pascal features are not supported, nor is the
fact that cccchhhhaaaarrrr variables are sometimes stored in 16
bits.
VVVVAAAAXXXX VAX/VMS Pascal version 3.5. Most but not all
language features supported. This has not yet been
tested on large programs.
OOOOrrrreeeeggggoooonnnn Oregon Software Pascal/2. All features implemented.
BBBBeeeerrrrkkkk Berkeley Pascal with Sun extensions.
MMMMoooodddduuuullllaaaa Modula-2. Based on Wirth's _P_r_o_g_r_a_m_m_i_n_g _i_n _M_o_d_u_l_a-_2,
3rd edition. Proper setting of the LLLLaaaannnngggguuuuaaaaggggeeee
parameter is _n_o_t optional. Translation will be
incomplete in most cases, but should be good enough
to work with. Structure of local sub-modules is
essentially ignored; like-named identifiers may be
confused. Type WORD is translated as an integer,
but type ADDRESS is translated as char * or void *;
this may cause inconsistencies in the output code.
Modula-2 modules have two parts in separate files.
Suppose these are called _f_o_o._d_e_f (definition part)
and _f_o_o._m_o_d (implementation part) for module _f_o_o.
Then a pattern like %%%%ssss....ddddeeeeffff must be included in the
IIIImmmmppppoooorrrrttttDDDDiiiirrrr list, and LLLLiiiibbbbrrrraaaarrrryyyyFFFFiiiilllleeee must be changed to
refer to _s_y_s_t_e_m._m_2 instead of _s_y_s_t_e_m._i_m_p. To
translate the definition part, give the command
p2c foo.def
to translate the definition part into files _f_o_o._h
and _f_o_o._c; the latter will usually be empty. The
command
p2c -s foo.def foo.mod
will translate the implementation part into file
- 5 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
_f_o_o._c.
Even if all language features are supported for a dialect,
some predefined functions may be omitted. In these cases,
the function call will be translated literally into C with a
warning. Some hand modification may be required.
CCCCOOOONNNNFFFFIIIIGGGGUUUURRRRAAAATTTTIIIIOOOONNNN PPPPAAAARRRRAAAAMMMMEEEETTTTEEEERRRRSSSS
_P_2_c is highly configurable. The defaults are suitable for
most applications, but customizing these parameters will
help you get the best possible translation. Since the
output of _p_2_c is intended to be used as human-maintainable
source code, there are many parameters for describing the
coding style and conventions you prefer. Others give hints
about your program that help _p_2_c to generate more correct,
efficient, or readable code.
The _p_2_c_r_c files contain a list of parameters, one per line.
The system configuration file, which may be viewed using the
----iiii option to _p_2_c, serves as an example of the proper format.
Parameter names are case-insensitive. If a parameter name
occurs exactly once in the system _p_2_c_r_c, this indicates that
it must have a unique value and the last value given to it
by the configuration files is used. Other parameters are
written several times in a row; these are lists to which
each configuration line adds an entry.
Many _p_2_c_r_c options take a numeric value of 0 or 1, roughly
corresponding to "no" or "yes." Sometimes a blank value or
the value "ddddeeeeffff" corresponds to an intermediate "maybe"
state. For example, the stylistic option EEEExxxxttttrrrraaaaPPPPaaaarrrreeeennnnssss
switches between copious or minimal parentheses in
expressions, with the default being a nice compromise
intended to be best for readers with an average knowledge of
C operator precedences.
Configuration options may also be embedded in the source
file in the form of Pascal comments:
{ShortOpt=0} {AvoidName=fred}
{FuncMacro slope(x,y)=atan2(y,x)*RadDeg}
disables automatic short-circuiting of aaaannnndddd and oooorrrr
expressions, adds "_f_r_e_d" to the list of names to avoid using
in generated C code, and defines a special translation for
the Pascal program's _s_l_o_p_e function using the standard C
_a_t_a_n_2 function and a constant _R_a_d_D_e_g presumably defined in
the program. Whitespace is generally not allowed in
embedded parameters. The `=' sign is required for embedded
parameters, though it is optional in _p_2_c_r_c files. Comments
within embedded parameters are delimited by `##'. Numeric
parameters may replace `=' with `+' or `-' to increase or
- 6 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
decrease the parameter; list-based parameters may use `-' to
remove a name from a list rather than adding it. Also, the
parameter name by itself in comment braces means to restore
the parameter's value that was current before the last
change:
{VarFiles=0 ## Pass FILE *'s params by value even if
VAR}
_s_o_m_e _d_e_c_l_a_r_a_t_i_o_n_s
{VarFiles ## Back to original FILE * passing}
causes the parameter VVVVaaaarrrrFFFFiiiilllleeeessss to have the value 0 for those
few declarations, without affecting the parameter's value
elsewhere in the file.
If an embedded parameter appears in an include file or in
interface text for a module, the effect of the assignment
normally carries over to any programs that included that
file. If the parameter name is preceded by a `*', then the
assignment is automatically undone after the source file
that contains it ends:
{IncludeFrom strings=<p2c/strings.h>}
{*ExportSymbol=pascal_%s}
module strings;
will record the location of the _s_t_r_i_n_g_s module's include
file for the rest of the translation, but the assignment of
EEEExxxxppppoooorrrrttttSSSSyyyymmmmbbbboooollll pertains only to the module itself.
For the complete list of _p_2_c_r_c parameters, run _p_2_c with the
----iiii option. Here are some additional comments on selected
parameters:
IIIImmmmppppoooorrrrttttAAAAllllllll Because Turbo Pascal only allows one unit per
source file, _p_2_c normally stops reading past
the word _i_m_p_l_e_m_e_n_t_a_t_i_o_n in a file being
scanned for interface text. But HP Pascal
allows several modules per file and so this
would not be safe to do. The IIIImmmmppppoooorrrrttttAAAAllllllll
option lets you override the default behavior
for your Pascal dialect.
AAAAnnnnssssiiiiCCCC This parameter selects which dialect of C to
use. If 1, all conventions of ANSI C such as
prototypes, vvvvooooiiiidddd **** pointers, etc. are used.
If 0, only strict K&R (first edition) C is
used. The default is to use "traditional
UNIX C," which includes eeeennnnuuuummmm and vvvvooooiiiidddd but not
vvvvooooiiiidddd **** or prototypes. Once again there are a
number of other parameters which may be used
to control the individual features if just
- 7 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
setting AAAAnnnnssssiiiiCCCC is not enough.
CCCC++++++++ At present _p_2_c does not use much of C++ at
all. The default action is to generate code
that will compile in either language.
UUUUsssseeeeVVVVEEEExxxxtttteeeerrrrnnnn Many non-UNIX linkers prohibit variables from
being defined (not declared) by more than one
source file. One module must declare, e.g.,
"int foo;", and all others must declare
"extern int foo;". _P_2_c accomplishes this by
declaring public variables "vvvveeeexxxxtttteeeerrrrnnnn" in
header files, and arranging for the macro
vvvveeeexxxxtttteeeerrrrnnnn to expand to eeeexxxxtttteeeerrrrnnnn or to nothing
when appropriate. If you set UUUUsssseeeeVVVVEEEExxxxtttteeeerrrrnnnn=0
_p_2_c will instead declare variables in a
simpler way that works only on UNIX-style
linkers.
UUUUsssseeeeAAAAnnnnyyyyppppttttrrrrMMMMaaaaccccrrrroooossss
Certain C reserved words have meanings which
may vary from one C implementation to
another. _P_2_c uses special capitalized names
for these words; these names are defined as
macros in the file _p_2_c._h which all translated
programs include. You can set
UUUUsssseeeeAAAAnnnnyyyyppppttttrrrrMMMMaaaaccccrrrroooossss=0 to disable the use of these
macros. Note that the functions of many of
these macros can also be had directly using
other parameters; for example, UUUUsssseeeeCCCCoooonnnnssssttttssss
allows you to specify whether your target
language recognizes the word ccccoooonnnnsssstttt in
constant declarations. The default is to use
the CCCCoooonnnnsssstttt macro instead, so that your code
will be portable to either kind of
implementation.
SSSSiiiiggggnnnneeeedddd expands to the reserved word ssssiiiiggggnnnneeeedddd if
that word is available, otherwise it is given
a null definition. Similarly, CCCCoooonnnnsssstttt expands
to ccccoooonnnnsssstttt if that feature is available. The
words VVVVoooollllaaaattttiiiilllleeee and RRRReeeeggggiiiisssstttteeeerrrr are also defined
in _p_2_c._h, although _p_2_c does not use them at
present. The word CCCChhhhaaaarrrr expands to cccchhhhaaaarrrr by
default, but might need to be redefined to
ssssiiiiggggnnnneeeedddd cccchhhhaaaarrrr or uuuunnnnssssiiiiggggnnnneeeedddd cccchhhhaaaarrrr in a particular
implementation. This is used for the Pascal
character type; lowercase cccchhhhaaaarrrr is used when
the desired meaning is "byte," not
"character."
The word SSSSttttaaaattttiiiicccc always expands to ssssttttaaaattttiiiicccc by
- 8 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
default. This is used in situations where a
function or variable is declared static to
make it local to the source file; lowercase
ssssttttaaaattttiiiicccc is used for static local variables.
Thus you can redefine SSSSttttaaaattttiiiicccc to be null if
you want to force private names to be public
for purposes of debugging.
The word VVVVooooiiiidddd expands to vvvvooooiiiidddd in all cases;
it is used when declaring a function with no
return value. The word AAAAnnnnyyyyppppttttrrrr is a typedef
for vvvvooooiiiidddd **** or cccchhhhaaaarrrr **** as necessary; it
represents a generic pointer.
UUUUsssseeeePPPPPPPPMMMMaaaaccccrrrroooossss The _p_2_c._h header also declares two macros for
function prototyping, PPPPPPPP(x) and PPPPVVVV(). These
macros are used as follows:
Void foo PP( (int x, int y, Char *z) );
Char *bar PV( );
If prototypes are available, these macros
will expand to
Void foo (int x, int y, Char *z);
Char *bar (void);
but if only old-style declarations are
supported, you instead get
Void foo ();
Char *bar ();
By default, _p_2_c uses these macros for all
function declarations, but function
_d_e_f_i_n_i_t_i_o_n_s are written in old-style C. The
UUUUsssseeeePPPPPPPPMMMMaaaaccccrrrroooossss parameter can be set to 0 to
disable all use of PPPPPPPP and PPPPVVVV, or it can be
set to 1 to use the macros even when defining
a function. (This is accomplished by
preceding each old-style definition with a
PPPPPPPP-style declaration.) If you know your code
will always be compiled on systems that
support prototyping, it is prettier to set
PPPPrrrroooottttoooottttyyyyppppeeeessss=1 or simply AAAAnnnnssssiiiiCCCC=1 to get true
function prototypes.
EEEEaaaattttNNNNooootttteeeessss Notes and warning messages containing any of
these strings as sub-strings are not omitted.
Each type of message includes an identifier
like [[[[111144445555]]]]; you can add this identifier to
the EEEEaaaattttNNNNooootttteeeessss list to suppress that message.
- 9 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
Another useful form is to use a variable name
or other identifier to suppress warnings
about that variable. The strings are a
space-separated list, and thus may not
contain embedded spaces. To suppress notes
around a section of code, use, e.g.,
{_E_a_t_N_o_t_e_s+[_1_4_5]} and {_E_a_t_N_o_t_e_s-[_1_4_5]}. Most
notes are generated during parsing, but to
suppress those generated during output the
string may need to remain in the list far
beyond the point where it appears to be
generated. Use the string "1" or "0" to
disable or enable all notes, respectively.
EEEExxxxppppaaaannnnddddIIIInnnncccclllluuuuddddeeeessss The default action is to expand Pascal
include files in-line. This may not be
desirable if include files are being used to
simulate modules. With EEEExxxxppppaaaannnnddddIIIInnnncccclllluuuuddddeeeessss=0, _p_2_c
attempts to convert include files containing
only whole procedures and global declarations
into analogous C include files. This may not
always work, though; if you get error
messages, don't use this option. By
combining this option with SSSSttttaaaattttiiiiccccFFFFuuuunnnnccccttttiiiioooonnnnssss=0,
then doing some fairly minor editing on the
result, you can convert a pseudo-modular
Pascal program into a truly modular
collection of C source files.
EEEElllliiiimmmmDDDDeeeeaaaaddddCCCCooooddddeeee Some transformations that _p_2_c does on the
program may result in unreachable or "dead"
code. By default _p_2_c removes such code, but
sometimes it removes more than it should. If
you have "if false" segments which you wish
to retain in C, you may have to set
EEEElllliiiimmmmDDDDeeeeaaaaddddCCCCooooddddeeee=0.
SSSSkkkkiiiippppIIIInnnnddddiiiicccceeeessss Normally Pascal arrays not based at zero are
"shifted" down for C, preserving the total
size of the array. A Pascal array a[2..10]
is translated to a C array a[9] with
references like "a[i]" changed to "a[i-2]"
everywhere. If SSSSkkkkiiiippppIIIInnnnddddiiiicccceeeessss is set to a value
of 2 or higher, this array would instead be
translated to a[11] with the first two
elements never used. This arrangement may
generate incorrect code, though, for tricky
source programs.
FFFFoooollllddddCCCCoooonnnnssssttttaaaannnnttttssss Pascal non-structured constants generally
translate to ####ddddeeeeffffiiiinnnneeee's in C. Set this to 1
to have constants instantiated directly into
- 10 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
the code. This may be turned on or off
around specific constant declarations. Set
this to 0 to force _p_2_c to make absolutely no
assumptions about the constant's value in
generated code, so that you can change the
constant later in the C code without
invalidating the translation. The default is
to allow _p_2_c to take advantage of its
knowledge of a constant's value, such as by
generating code that assumes the constant is
positive.
CCCChhhhaaaarrrrCCCCoooonnnnssssttttssss This governs whether single-character string
literals in Pascal ccccoooonnnnsssstttt declarations should
be interpreted as characters or strings. In
other words, _c_o_n_s_t _a='_x'; will translate to
#_d_e_f_i_n_e _a '_x' if CCCChhhhaaaarrrrCCCCoooonnnnssssttttssss=1 (the default),
or to #_d_e_f_i_n_e _a _x if CCCChhhhaaaarrrrCCCCoooonnnnssssttttssss=0. Note that
if _p_2_c guesses wrong, the generated code will
not be wrong, just uglier. For example, if _a
is written as a character constant but it
turns out to be used as a string, _p_2_c will
have to write char-to-string conversion code
each time the constant is used.
VVVVaaaarrrrSSSSttttrrrriiiinnnnggggssss In HP Pascal, a parameter of the form "var s
: string" will match a string variable of any
size; a hidden size parameter is passed which
may be accessed by the Pascal _s_t_r_m_a_x
function. You can prevent _p_2_c from creating
a hidden size parameter by setting
VVVVaaaarrrrSSSSttttrrrriiiinnnngggg=0. (Note that each function uses
the value of VVVVaaaarrrrSSSSttttrrrriiiinnnnggggssss as of the _f_i_r_s_t
declaration of the function that is parsed,
which is often in the interface section of a
module.)
PPPPrrrroooottttoooottttyyyyppppeeeessss Control whether ANSI C function prototypes
are used. Default is according to AAAAnnnnssssiiiiCCCC.
This also controls whether to include
parameter names or just their types in
situations where names are optional. The
FFFFuuuullllllllPPPPrrrroooottttoooottttyyyyppppiiiinnnngggg parameter allows prototypes
to be generated for declarations but not for
definitions (older versions of Lightspeed C
required this). If you use a mixture of
prototypes and old-style definitions, types
like short and float will be promoted to int
and double as required by the ANSI standard,
unless PPPPrrrroooommmmooootttteeeeAAAArrrrggggssss is used to override this.
The CCCCaaaassssttttAAAArrrrggggssss parameter controls whether
type-casts are used in function arguments; by
- 11 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
default they are used only if prototypes are
not available.
SSSSttttaaaattttiiiiccccLLLLiiiinnnnkkkkssss HP Pascal and Turbo Pascal each include the
concept of procedure or function pointers,
though with somewhat different syntaxes. _P_2_c
recognizes both notational styles. Another
difference is that HP's procedure pointers
can point to nested procedures, while Turbo's
can point only to global procedures. In HP
Pascal a procedure pointer must be stored as
a ssssttttrrrruuuucccctttt containing both a pure C function
pointer and a "static link," a pointer to the
parent procedure's locals. (The static link
is NULL for global procedures.) This
notation can be forced by setting
SSSSttttaaaattttiiiiccccLLLLiiiinnnnkkkkssss=1. In Turbo, the default
(SSSSttttaaaattttiiiiccccLLLLiiiinnnnkkkkssss=0) is to use plain C function
pointers with no static links. A third
option (SSSSttttaaaattttiiiiccccLLLLiiiinnnnkkkkssss=2) uses structures with
static links, but assumes the links are
always NULL when calling through a pointer
(if you need compatibility with the HP format
but know your procedures are global).
SSSSmmmmaaaallllllllSSSSeeeettttCCCCoooonnnnsssstttt Pascal sets are translated into one of two
formats, depending on the size of the set.
If all elements have ordinal values in the
range 0..31, the set is translated as a
single integer variable using bit operations.
(The SSSSeeeettttBBBBiiiittttssss parameter may be used to change
the upper limit of 31.) The SSSSmmmmaaaallllllllSSSSeeeettttCCCCoooonnnnsssstttt
parameter controls whether these small-sets
are used, and, if so, how constant sets
should be represented in C. For larger
sets, an array of lllloooonnnngggg is used. The _s[0]
element contains the number of succeeding
array elements which are in use. Set
elements in the range 0..31 are stored in the
_s[1] array element, and so on. Sets are
normalized so that _s[_s[0]] is nonzero for any
nonempty set. The standard run-time library
includes all the necessary procedures for
operating on sets.
RRRReeeettttuuuurrrrnnnnVVVVaaaalllluuuueeeeNNNNaaaammmmeeee
This is one of many "naming conventions"
parameters. Most of these take the form of a
_p_r_i_n_t_f-like string containing a %_s where the
relevant information should go. In the case
of RRRReeeettttuuuurrrrnnnnVVVVaaaalllluuuueeeeNNNNaaaammmmeeee, the %_s refers to a
function name and the resulting string gives
- 12 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
the name of the variable to use to hold the
function's return value. Such a variable
will be made if a function contains
assignments to its return value buried within
the body, so that _r_e_t_u_r_n statements cannot
conveniently be used. Some parameters
(RRRReeeettttuuuurrrrnnnnVVVVaaaalllluuuueeeeNNNNaaaammmmeeee included) do not require the
%_s to be present in the format string; for
example, the standard _p_2_c_r_c file stores every
function's return value in a variable called
_R_e_s_u_l_t.
AAAAlllltttteeeerrrrnnnnaaaatttteeeeNNNNaaaammmmeeee _P_2_c normally translates Pascal names into C
names verbatim, but occasionally this is not
possible. A Pascal name may be a C reserved
word or traditional C name like _p_u_t_c, or
there may be several like-named things that
are hidden from each other by Pascal's
scoping rules but must be global in C. In
these situations _p_2_c uses the parameter
AAAAlllltttteeeerrrrnnnnaaaatttteeeeNNNNaaaammmmeeee1111 to generate an alternative
name for the symbol. The default is to add
an underscore to the name. There is also an
AAAAlllltttteeeerrrrnnnnaaaatttteeeeNNNNaaaammmmeeee2222 parameter for a second
alternate name, and an AAAAlllltttteeeerrrrnnnnaaaatttteeeeNNNNaaaammmmeeee
parameter for the _nth alternate name. (The
value for this parameter should include both
a %_s and a %_d, in either order.) If these
latter parameters are not defined, _p_2_c
applies AAAAlllltttteeeerrrrnnnnaaaatttteeeeNNNNaaaammmmeeee1111 many times over.
EEEExxxxppppoooorrrrttttSSSSyyyymmmmbbbboooollll Symbols in the interface section for a Pascal
module are formatted according to the value
of EEEExxxxppppoooorrrrttttSSSSyyyymmmmbbbboooollll, if any. It is not uncommon
to use _m_o_d_u_l_e_n_a_m_e_%_s for this symbol; the
default is %_s, i.e., no special treatment for
exported symbols. If you also define the
EEEExxxxppppoooorrrrtttt____SSSSyyyymmmmbbbboooollll parameter, that format is used
instead for exported symbols which contain an
underscore character. If %_S (with a capital
"S") appears in the format string it stands
for the current module name.
AAAAlllliiiiaaaassss If the value of this parameter contains a %_s,
it is a format string applied to the names of
external functions or variables. If the
value does not contain a %_s, it becomes the
name of the next external symbol which is
declared (after which the parameter is
cleared).
SSSSyyyynnnnoooonnnnyyyymmmm This creates a synonym for another Pascal
- 13 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
symbol or keyword. The format is
SSSSyyyynnnnoooonnnnyyyymmmm _o_l_d-_n_a_m_e = _n_e_w-_n_a_m_e
All occurrences of _o_l_d-_n_a_m_e in the input text
are treated as if they were _n_e_w-_n_a_m_e by the
parser. If _n_e_w-_n_a_m_e is a keyword, _o_l_d-_n_a_m_e
will be an equivalent keyword. If _n_e_w-_n_a_m_e
is the name of a predefined function, _o_l_d-
_n_a_m_e will behave in the same way as that
function, and so on. If _n_e_w-_n_a_m_e is omitted,
then occurrences of _o_l_d-_n_a_m_e are entirely
ignored in the input file. Synonyms allow
you to skip over a keyword in your dialect of
Pascal that is not understood by _p_2_c, or to
simulate a keyword or predefined identifier
of your dialect with a similar one that _p_2_c
recognizes. Note that all predefined
functions are available at all times; if you
have a library routine that behaves like,
e.g., Turbo Pascal's _g_e_t_m_e_m procedure, you
can make your routine a synonym for _g_e_t_m_e_m
even if you are not translating in Turbo
mode.
NNNNaaaammmmeeeeOOOOffff This defines the name to use in C for a
specific symbol. It must appear before the
symbol is declared in the Pascal code; it is
usually placed in the local _p_2_c_r_c file for
the project. The format is
NNNNaaaammmmeeeeOOOOffff _p_a_s_c_a_l-_n_a_m_e = _C-_n_a_m_e
By default, Pascal names map directly onto C
names with no change (except for the various
kinds of formatting outlined above). If the
_p_a_s_c_a_l-_n_a_m_e is of the form _m_o_d_u_l_e._n_a_m_e or
_p_r_o_c_e_d_u_r_e._n_a_m_e then the command applies only
to the instance of the Pascal name that is
global to that module, or local to that
procedure. Otherwise, it applies to all
usages of the name.
VVVVaaaarrrrMMMMaaaaccccrrrroooo This is analogous to NNNNaaaammmmeeeeOOOOffff, but specifically
for use with Pascal variables. The righthand
side can be most any C expression; all
references to the variable are expanded into
that C expression. Names used in the C
expression are taken verbatim. There is also
a CCCCoooonnnnssssttttMMMMaaaaccccrrrroooo parameter for translating
constants as arbitrary expressions. Note
that the variable on the lefthand side must
- 14 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
actually be declared in the program or in a
module that it uses. The declaration for the
variable will be omitted from the generated
code unless the Pascal-name appears in the
expression: If you ask to replace _i with
_i+_1, the variable _i will still be declared
but its value will be shifted accordingly.
Note that if _i appears on the lefthand side
of an assignment, _p_2_c will use algebra to
"solve" for _i.
In all cases where _p_2_c parses C expressions,
all C operators are recognized except
compound assignments like `+='. (Increment
and decrement operators are allowed.) All
variable and function names are assumed to
have integer type, even if they are names
that occur in the actual program. A type-
specification operator `::' has been
introduced; it has the same precedence as `.'
or `->' but the righthand side must be a
Pascal type identifier (built-in or defined
by your program previously to when the macro
definition was parsed), or an arbitrary
Pascal type expression in parentheses. The
lefthand argument is then considered to have
the specified type. This may be necessary if
your macro is used in situations where the
exact type of the expression must be known
(say, as the argument to a _w_r_i_t_e_l_n).
FFFFiiiieeeellllddddMMMMaaaaccccrrrroooo Here the lefthand side must have the form
_r_e_c_o_r_d._f_i_e_l_d, where _r_e_c_o_r_d is the Pascal type
or variable name for a record, and _f_i_e_l_d is a
field in that record. The righthand side
must be a C expression generally including
the name _r_e_c_o_r_d. All instances of that name
are replaced by the actual record being
"dotted." For example,
FieldMacro Rect.topLeft = topLeft(Rect)
translates _a[_i]._t_o_p_L_e_f_t into _t_o_p_L_e_f_t(_a[_i]),
where _a is an array of _R_e_c_t.
FFFFuuuunnnnccccMMMMaaaaccccrrrroooo The lefthand side must be any Pascal function
or procedure name plus a parameter list. The
number of parameters must match the number in
the function's uses and declaration. Calls
to the function are replaced by the C
expression on the righthand side. For
example,
- 15 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
FuncMacro PtInRect(p,r) = PtInRect(p,&r)
causes the second argument of _P_t_I_n_R_e_c_t to be
passed by reference, even though the
declaration says it's not. If the function
in question is actually defined in the
program or module being translated, the
FFFFuuuunnnnccccMMMMaaaaccccrrrroooo will not affect the definition but
it will affect all calls to the function
elsewhere in the module. FFFFuuuunnnnccccMMMMaaaaccccrrrroooossss can also
be applied to predefined or never-defined
functions.
IIIInnnncccclllluuuuddddeeeeFFFFrrrroooommmm This specifies that a given module's header
should be included from a given place. The
second argument may be surrounded by " " or
< > as necessary; if the second argument is
omitted, no include directive will be
generated for the module.
IIIImmmmppppoooorrrrttttFFFFrrrroooommmm This specifies that a given module's Pascal
interface text can be found in the given
file. The named file should be either the
source file for the module, or a specially
prepared file with the implementation section
removed for speed. If no IIIImmmmppppoooorrrrttttFFFFrrrroooommmm entry is
found for a module, the path defined by the
IIIImmmmppppoooorrrrttttDDDDiiiirrrr list is searched. Each entry in
the path may contain a %_s, which expands to
the name of the module. The default path
looks for %_s._p_a_s and %_s._t_e_x_t in the current
directory, then for /_u_s_r/_l_i_b/_p_2_c/%_s._i_m_p.
(where /usr/lib/p2c is the _p_2_c home
directory.)
SSSSttttrrrruuuuccccttttFFFFuuuunnnnccccttttiiiioooonnnn This parameter is a list of functions which
follow the _p_2_c semantics for structure-valued
functions (functions returning arrays, sets,
and strings, and structs in primitive C
dialects). For these functions, a pointer to
a return-value area is passed to the function
as a special first parameter. The function
stores the result in this area, then returns
a copy of the pointer. (The standard C
function _s_t_r_c_p_y is an example of this
concept. _S_p_r_i_n_t_f also behaves this way in
some dialects; it always appears on the
SSSSttttrrrruuuuccccttttFFFFuuuunnnnccccttttiiiioooonnnn list regardless of the type of
implementation.) The system configuration
file includes a list of common structured
functions so that _p_2_c's optimizer will know
how to manipulate them.
- 16 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
SSSSttttrrrrllllaaaappppFFFFuuuunnnnccccttttiiiioooonnnn Functions on this list are structured
functions as above, but with the ability to
work in-place; that is, the same pointer may
be passed as both the return value area and a
regular parameter.
DDDDeeeetttteeeerrrrmmmmiiiinnnniiiissssttttiiiicccc Functions on this list have no side effects
or side dependencies. An example is the _s_i_n
function in the standard math library; two
calls with the same parameter values produce
the same result, and have no effects other
than returning a value. _P_2_c can make use of
this knowledge when optimizing code for
efficiency or readability. Functions on this
list are also assumed to be relatively fast,
so that it is acceptable to duplicate a call
to the function.
LLLLeeeeaaaavvvveeeeAAAAlllloooonnnneeee Functions on this list are not subjected to
the normal built-in translation rules that
_p_2_c would otherwise use. For example, adding
_w_r_i_t_e_l_n to this list would translate _w_r_i_t_e_l_n
statements blindly into calls to a C
_w_r_i_t_e_l_n() function, rather than being
translated into equivalent _p_r_i_n_t_f calls. The
built-in translation is also suppressed if
the function has a FFFFuuuunnnnccccMMMMaaaaccccrrrroooo.
BBBBuuuuffffffffeeeerrrreeeeddddFFFFiiiilllleeee _P_2_c normally assumes binary files will use
_r_e_a_d/_w_r_i_t_e, not _g_e_t/_p_u_t/^ notation. A file
buffer variable will only be created for a
file if buffer notation is used for it. For
global file variables this may be detected
too late (a declaration without buffers may
already have been written). Such files can
be listed in BBBBuuuuffffffffeeeerrrreeeeddddFFFFiiiilllleeee to force _p_2_c to
allocate buffers for them; do this if you get
a warning message that says it is necessary.
Set BBBBuuuuffffffffeeeerrrreeeeddddFFFFiiiilllleeee=1 to buffer all files, in
which case UUUUnnnnBBBBuuuuffffffffeeeerrrreeeeddddFFFFiiiilllleeee allows you to force
certain files _n_o_t to have buffers.
SSSSttttrrrruuuuccccttttFFFFiiiilllleeeessss If _p_2_c still can't translate your file
operations correctly, you can set
SSSSttttrrrruuuuccccttttFFFFiiiilllleeeessss=1 to cause Pascal files to
translate into structs which include the
usual C _F_I_L_E pointer, as well as file buffer
and file name fields. While the resulting
code doesn't look as much like native C, the
file structs will allow _p_2_c to do a correct
translation in many more cases.
- 17 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
CCCChhhheeeecccckkkkFFFFiiiilllleeeeEEEEOOOOFFFF Normally only file-open operations are
checked for errors. Additional error
checking, such as read-past-end-of-file, can
be enabled with parameters like CCCChhhheeeecccckkkkFFFFiiiilllleeeeEEEEOOOOFFFF.
These checks can make the code very ugly! If
I/O checking is enabled by the program
($$$$iiiioooocccchhhheeeecccckkkk oooonnnn$$$$ in HP Pascal; {{{{$$$$IIII++++}}}} in Turbo;
this is always the default state), these
checks will generate fatal errors unless
enclosed in an HP Pascal ttttrrrryyyy-rrrreeeeccccoooovvvveeeerrrr
construct. If I/O checking is disabled,
these will cause the global variable
_P__i_o_r_e_s_u_l_t to be set zero or nonzero
according to the outcome. The default for
most of these options is to check only when
I/O checking is disabled.
IIIISSSSSSSSUUUUEEEESSSS
IIIInnnntttteeeeggggeeeerrrr ssssiiiizzzzeeee.... _P_2_c normally generates code to work with
either 16 or 32 bit ints. If you know your C integers will
be 16 or 32 bits, set IIIInnnnttttSSSSiiiizzzzeeee appropriately. In particular
setting IIIInnnnttttSSSSiiiizzzzeeee=32 will generate much cleaner code: _p_2_c no
longer must carefully cast function arguments between int
and long. These casts also will be unnecessary if ANSI
prototypes are available. To disable int/long casting
because you know at least one of these cases will hold, set
CCCCaaaassssttttLLLLoooonnnnggggAAAArrrrggggssss=0. (The CCCCaaaassssttttAAAArrrrggggssss parameter similarly controls
other types of casts, such as between ints and doubles.) The
IIIInnnntttteeeeggggeeeerrrr11116666 parameter controls whether Pascal integers are
interpreted as 16 or 32 bits, or translated as native C
integers. The default value depends on the LLLLaaaannnngggguuuuaaaaggggeeee
selected.
SSSSiiiiggggnnnneeeedddd////uuuunnnnssssiiiiggggnnnneeeedddd cccchhhhaaaarrrrssss.... Pascal characters are normally
"weakly" interpreted as unsigned; this is controlled by
UUUUnnnnssssiiiiggggnnnneeeeddddCCCChhhhaaaarrrr. The default is "either," so that C's native
cccchhhhaaaarrrr type may be used even if its signed-ness is unknown.
Code that uses characters outside of the range 0-127 may
need a different setting. Alternatively, you can use the
types {{{{SSSSIIIIGGGGNNNNEEEEDDDD}}}} cccchhhhaaaarrrr and {{{{UUUUNNNNSSSSIIIIGGGGNNNNEEEEDDDD}}}} cccchhhhaaaarrrr in the few cases
where it really matters. These comments are controlled by
the SSSSiiiiggggnnnneeeeddddCCCCoooommmmmmmmeeeennnntttt and UUUUnnnnssssiiiiggggnnnneeeeddddCCCCoooommmmmmmmeeeennnntttt parameters. (The type
{{{{UUUUNNNNSSSSIIIIGGGGNNNNEEEEDDDD}}}} iiiinnnntttteeeeggggeeeerrrr is also recognized.) The SSSSiiiiggggnnnneeeeddddCCCChhhhaaaarrrr
parameter tells whether C characters are signed or unsigned
(default is "unknown"). The HHHHaaaassssSSSSiiiiggggnnnneeeeddddCCCChhhhaaaarrrr parameter tells
whether the phrase "signed char" is legal in the output. If
it is not, _p_2_c may have to translate Pascal signed bytes
into C shorts.
SSSSppppeeeecccciiiiaaaallll ttttyyyyppppeeeessss.... _P_2_c understands the following predefined
Pascal type names: iiiinnnntttteeeeggggeeeerrrr, signed integers depending on
IIIInnnntttteeeeggggeeeerrrr11116666; lllloooonnnnggggiiiinnnntttt, signed 32-bit integers; uuuunnnnssssiiiiggggnnnneeeedddd,
- 18 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
unsigned 32-bit integers; sssswwwwoooorrrrdddd, signed 16-bit integers;
wwwwoooorrrrdddd, unsigned 16-bit integers; cccc____iiiinnnntttt, signed native C
integers; cccc____uuuuiiiinnnntttt, unsigned native C integers; ssssbbbbyyyytttteeee, signed
8-bit integers; bbbbyyyytttteeee, unsigned 8-bit integers; rrrreeeeaaaallll,
floating-point numbers depending on DDDDoooouuuubbbblllleeeeRRRReeeeaaaallllssss; ssssiiiinnnngggglllleeee,
single-precision floats; lllloooonnnnggggrrrreeeeaaaallll, ddddoooouuuubbbblllleeee, and eeeexxxxtttteeeennnnddddeeeedddd,
double-precision floats; ppppooooiiiinnnntttteeeerrrr and aaaannnnyyyyppppttttrrrr, generic
pointers (assignment-compatible with any pointer type);
ssssttttrrrriiiinnnngggg, generic string of length SSSSttttrrrriiiinnnnggggDDDDeeeeffffaaaauuuulllltttt (normally
255); also, the usual Pascal types cccchhhhaaaarrrr, bbbboooooooolllleeeeaaaannnn, and tttteeeexxxxtttt.
(If your Pascal uses different names for these concepts, the
SSSSyyyynnnnoooonnnnyyyymmmm option will come in handy.)
EEEEmmmmbbbbeeeeddddddddeeeedddd ccccooooddddeeee.... It is possible to write a Pascal comment
containing C code to be embedded into the output. See the
descriptions of EEEEmmmmbbbbeeeeddddCCCCoooommmmmmmmeeeennnntttt and its relatives in the system
_p_2_c_r_c file. These techniques are helpful if you plan to do
repeated translations of code that is still being maintained
in Pascal.
CCCCoooommmmmmmmeeeennnnttttssss aaaannnndddd bbbbllllaaaannnnkkkk lllliiiinnnneeeessss.... _P_2_c collects the comments in a
procedure into a list. All comments and statements are
stamped with serial numbers which are used to reattach
comments to statements even after code has been added,
removed, or rearranged during translation. "Orphan"
comments attached to statements that have been lost are
attached to nearby statements or emitted at the end of the
procedure. Blank lines are treated as a kind of comment, so
_p_2_c will also reproduce your usage of blank lines. If the
comment mechanism goes awry, you can disable comments with
EEEEaaaattttCCCCoooommmmmmmmeeeennnnttttssss or disable their being attached to code with
SSSSppppiiiittttCCCCoooommmmmmmmeeeennnnttttssss.
IIIInnnnddddeeeennnnttttaaaattttiiiioooonnnn.... _P_2_c has a number of parameters to govern
indentation of code. The default values produce the GNU
Emacs standard indentation style, although _p_2_c can do a
better job since it knows more about the code it is
indenting. Indentation works by applying "indentation
deltas," which are either absolute numbers (which override
the previous indentation), or signed relative numbers (which
augment the previous indentation). A delta of "+0"
specifies no change in indentation. All of the indentation
options are described in the standard _p_2_c_r_c file.
LLLLiiiinnnneeee bbbbrrrreeeeaaaakkkkiiiinnnngggg.... _P_2_c uses an algorithm similar to the TeX
typesetter's paragraph formatter for breaking long
statements into multiple lines. A "penalty" is assigned to
various undesirable aspects of all possible line breaks; the
"badness" of a set of line breaks is approximately the sum
of all the penalties. Chief among these are serious
penalties for overrunning the desired maximum line length
(default 78 columns), an infinite penalty for overrunning
- 19 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
the absolute maximum line length (default 90), and
progressively greater penalties for breaking at operators
deeply nested in expressions. Parameters such as
OOOOppppBBBBrrrreeeeaaaakkkkPPPPeeeennnnaaaallllttttyyyy control the relative weights of various
choices. BBBBrrrreeeeaaaakkkkAAAArrrriiiitttthhhh and its neighbors control whether the
operator at a line break should be placed at the end of the
previous line or at the beginning of the next. If you don't
want any oversize lines, define MMMMaaaaxxxxLLLLiiiinnnneeeeWWWWiiiiddddtttthhhh=78.
Unlike TeX, _p_2_c's line breaker must actually try all
possible sets of break points. To avoid excessive
computation, the total penalty contributed at each decision
point must sum to a nonnegative value; negative values are
clipped up to zero. This allows _p_2_c to prune away obviously
undesirable alternatives in advance. The MMMMaaaaxxxxLLLLiiiinnnneeeeBBBBrrrreeeeaaaakkkkTTTTrrrriiiieeeessss
parameter (default 5000) controls how many alternatives to
try before giving up and using the best so far.
PPPPAAAASSSSCCCCAAAALLLL____MMMMAAAAIIIINNNN.... _P_2_c generates a call to this function at the
front of the main program. In the (unmodified) run-time
library all this does is save argc and argv away because in
both HP and Turbo these are accessed as global variables.
If you do not wish to use this feature, define AAAArrrrggggCCCCNNNNaaaammmmeeee to
be _a_r_g_c, AAAArrrrggggVVVVNNNNaaaammmmeeee to be _a_r_g_v, and MMMMaaaaiiiinnnnNNNNaaaammmmeeee (normally
"PASCAL_MAIN") to be blank. This will work if argc and argv
are never accessed outside of your main program.
BBBBUUUUGGGGSSSS
_P_2_c was designed with the idea that clean, readable output
in most cases is worth more than guaranteed correct output
in extreme cases. _P_2_c is _n_o_t a compiler! However, ideally
the "extreme" cases would include only those which never
arise in real life. Thus if _p_2_c actually generates
incorrect code I will consider it a bug, but I will not
apologize for it. :-) Below are the major remaining cases
where this is known to occur.
Certain kinds of conformant array parameters (including
multi-dimensional conformant arrays) produce code that
declares variable-length arrays in C. Only a few C
compilers, such as the GNU C compiler, support this language
extension. Otherwise some hand re-coding will be required.
HP Pascal ttttrrrryyyy-rrrreeeeccccoooovvvveeeerrrr structures are translated into calls
to _T_R_Y and _R_E_C_O_V_E_R macros, which are defined to simulate the
construct using _s_e_t_j_m_p and _l_o_n_g_j_m_p. If this emulation does
not work, define the symbol FFFFAAAAKKKKEEEE____TTTTRRRRYYYY to cause these macros
to become "inert." (In cases where the error is detected by
code physically within the body of the ttttrrrryyyy statement, a C
ggggoooottttoooo to the rrrreeeeccccoooovvvveeeerrrr section is always generated.) Also,
local file variables in scopes which are destroyed by an
eeeessssccccaaaappppeeee are not closed.
- 20 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
Non-local GOTO's and ttttrrrryyyy-rrrreeeeccccoooovvvveeeerrrr statements are each
implemented, but may conflict if both are used at once.
Non-local GOTO's are fairly careful about closing files that
go out of scope but may fail to do so in the presence of
recursion.
Arrays containing files are not initialized to NULL as other
files are. In some cases, such as file variables allocated
by NEW, the file is initialized but not automatically closed
by DISPOSE.
LINK variables allowing sub-procedures access to their
parents' variables are occasionally omitted by mistake, if
the access is too indirect for _p_2_c to notice. If this
happens, you can add an explicit reference to a parent
variable in the sub-procedure. A statement of the form
"a:=a" will count as a reference but then be optimized away
by _p_2_c.
Many aspects of Modula-2 are translated only superficially.
For example, the type-compatibility properties of the _W_O_R_D
and _A_R_R_A_Y _O_F _W_O_R_D types are only roughly modelled, as are
the scope rules concerning modules.
Parts of VAX Pascal are still untreated. In particular, the
[_U_N_S_A_F_E] attribute and a few others are not fully supported,
nor are the semantics of the _O_P_E_N procedure.
Turbo and VAX Pascal's _d_o_u_b_l_e, _q_u_a_d_r_u_p_l_e, and _e_x_t_e_n_d_e_d real
types all translate to the C ddddoooouuuubbbblllleeee type. Turbo's
_c_o_m_p_u_t_a_t_i_o_n_a_l type is not supported at all.
Because Pascal strings (with length bytes) are translated
into C strings (with null terminators), certain Pascal
string tricks will not work in the translated code. For
example the assignment _s[_0]:=_c_h_r(_x) is translated to _s[_x]=_0
on the assumption that the string is being shortened. If _x
is actually greater than the current length, but not of a
recognizable form like _o_r_d(_s[_0])+_n, then the generated code
will not work. In VAX Pascal this corresponds to performing
arithmetic on the _L_E_N_G_T_H field of a varying-length string.
Turbo Pascal's automatic clipping of strings is not
supported. In Turbo, if a ten character string is assigned
to a _s_t_r_i_n_g[_8] variable, the last two characters are
silently removed. The code produced by _p_2_c generally will
overrun the target string instead! The SSSSttttrrrriiiinnnnggggTTTTrrrruuuunnnnccccLLLLiiiimmmmiiiitttt
parameter (80 by default if LLLLaaaannnngggguuuuaaaaggggeeee=TTTTuuuurrrrbbbboooo) specifies a
string size which should be considered "short"; assignments
of potentially-long strings to short string variables will
cause a warning but will not automatically truncate. The
cure is to use _c_o_p_y in the Pascal source to truncate the
- 21 - Formatted: February 28, 1991
PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111))))
strings explicitly.
FFFFIIIILLLLEEEESSSS
file._x_x_x Pascal source files
file.c resulting C source file
module.h resulting C header file
p2crc local configuration file
.p2crc alternate local configuration file
/usr/lib/p2c/p2crc system-wide configuration file
/usr/lib/p2c/system.impdeclarations for predefined functions
/usr/lib/p2c/system.m2 analogous declarations for Modula-2
/usr/lib/p2c/*.imp interface text for standard modules
/usr/include/p2c/p2c.h header file for translated programs
/usr/lib/libp2c.a run-time library
AAAAUUUUTTTTHHHHOOOORRRR
Dave Gillespie, daveg@csvax.cs.caltech.edu.
Many thanks to William Bader, Steven Levi, Rick Koshi, Eric
Raymond, Magne Haveraaen, Dirk Grunwald, David Barto, Paul
Fisher, Tom Schneider, and others whose suggestions and bug
reports have helped improve _p_2_c in countless ways.
- 22 - Formatted: February 28, 1991