home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-08-01 | 51.1 KB | 1,452 lines |
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- NAME
- p2c - Pascal to C translator, version 1.19
-
- SYNOPSIS
- p2c [ options ] [ file [ module ] ]
-
- DESCRIPTION
- P2c 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 .c and .h 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 p2c sometimes chooses to
- generate readable code at the expense of absolute
- generality. P2c 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, p2c will also serve as an ad hoc Pascal compiler.
-
- Code generated by p2c normally does not assume characters
- are signed or unsigned. Also, it assumes int is the same as
- either short or long but does not depend on which. However,
- if int is not the same as long 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 <p2c/p2c.h> which in
- turn includes <stdio.h> and various other common resources.
- Also, many translated programs will need to be linked with
- the run-time library, typically -lp2c.
-
- Given a file name, p2c reads from the specified file and
- outputs to a file with a .c suffix added or substituted.
- For example,
-
- p2c myfile.pas
-
- reads from myfile.pas to produce the file myfile.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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- nomenclature), or it may just contain a number of procedures
- and declarations. P2c 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 module.h containing a translation of the module's
- interface section. The implementation section may be
- omitted in which case only the .h file will be interesting.
- If the program or module has include files, these may cause
- additional .c files to be generated depending on the value
- of the ExpandIncludes option (see below).
-
- If no file name is given, p2c reads Pascal from the standard
- input and writes the resulting C to standard output (though
- a .h 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 module.c and
- module.h. P2c never translates more than one module per
- run.
-
- Before starting, p2c reads the file /usr/lib/p2c/p2crc for a
- number of configuration parameters. (The actual path used
- on your system may vary. The -i 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 Include %H/p2crc to
- include the system file. Next, p2c attempts to read the
- file p2crc in your directory for further configuration. If
- this file does not exist, p2c looks for .p2crc instead.
-
- OPTIONS
- -o cfile
- Use cfile in place of file.c or module.c as the primary
- output file. A single dash (`-o -') says to write the
- C code to the standard output.
-
- -h hfile
- Use hfile in place of module.h as the output file for
- interface text. This only has effect if the input is
- an HP Pascal module or a Turbo Pascal unit.
-
- -s sfile
- Read interface text from sfile 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 ImportFrom and ImportDir
- parameters in p2crc are set up to allow p2c to locate
- interface text without needing any -s options.) If
-
-
-
- - 2 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- there are several -s options in the command, the sfiles
- are read from left to right.
-
- -pn Display progress of translation in the form of a line
- number/file name display. This is refreshed every n
- lines, 25 by default.
-
- -c rcfile
- Read local configuration commands from rcfile instead
- of p2crc or .p2crc. A dash (`-c -') in place of rcfile
- causes no local configuration file to be used.
-
- -v ("Vanilla.") Do not read from the system configuration
- file /usr/lib/p2c/p2crc. 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.
-
- -H homedir
- Use homedir instead of /usr/lib/p2c as the p2c home
- directory. The system p2crc file will be searched for
- in this directory.
-
- -Ipattern
- Add pattern to the ImportDir 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, ../%s.pas looks for
- modulename.pas in the parent of the current directory.
-
- -i This special option (which must be the only argument on
- the command line if used) simply copies the system
- configuration file /usr/lib/p2c/p2crc to the standard
- output in its entirety. (It may be used with -H, but
- -i is most useful precisely when you don't know the
- location of the home directory.)
-
- -q Quiet mode. Suppresses output of status messages
- during translation.
-
- -En Abort translation after n errors. If n is omitted it
- defaults to zero, which means unlimited errors are
- allowed. Use -E1 to make p2c halt after the first
- error.
-
- -e Echo the Pascal source into the output file, surrounded
- by #ifdefs. This is the same as the CopySource
- parameter in the p2crc file.
-
- -a Produce modern ANSI C. This is a convenient override
-
-
-
- - 3 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- for the AnsiC parameter in the p2crc file.
-
- -L language
- Select input language name, such as VAX or TURBO. This
- is a convenient override for the Language parameter.
-
- -V Verbose mode. This causes p2c 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.
-
- -M0 Disable memory conservation. This prevents p2c from
- freeing various data structures after translating each
- function, in case this new conservation feature causes
- unforseen problems.
-
- -R Regression testing mode. Formats notes and warning
- messages in a way that makes it easier to run diff(1)
- on the output of p2c.
-
- P2c also understands a few debugging options which may
- occasionally be useful when tracking down translation
- problems. The -dn 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, -t
- prints debugging information at every Pascal token, -Bn
- enables line-breaker debugging, and -Cn enables comment
- placement debugging.
-
- CHOICE OF SOURCE LANGUAGE
- The Language configuration parameter or -L command-line
- option tells p2c 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 Language
- 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 p2c. Names are
- case-insensitive.
-
- HP 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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- HP-UX HP Pascal, HP-UX version. Almost identical to the
- "HP" dialect.
-
- Turbo Turbo Pascal 5.0 for the IBM PC. Few conflicts with
- HP Pascal, so the Language parameter is not often
- needed for Turbo. (Most important is that the Turbo
- and HP dialects use 16 and 32 bit integers,
- respectively.)
-
- UCSD UCSD Pascal. Similar to Turbo in many ways.
-
- MPW 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 char variables are sometimes stored in 16
- bits.
-
- VAX VAX/VMS Pascal version 3.5. Most but not all
- language features supported. This has not yet been
- tested on large programs.
-
- Oregon Oregon Software Pascal/2. All features implemented.
-
- Berk Berkeley Pascal with Sun extensions.
-
- Modula Modula-2. Based on Wirth's Programming in Modula-2,
- 3rd edition. Proper setting of the Language
- parameter is not 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 foo.def (definition part)
- and foo.mod (implementation part) for module foo.
- Then a pattern like %s.def must be included in the
- ImportDir list, and LibraryFile must be changed to
- refer to system.m2 instead of system.imp. To
- translate the definition part, give the command
-
- p2c foo.def
-
- to translate the definition part into files foo.h
- and foo.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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- foo.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.
-
- CONFIGURATION PARAMETERS
- P2c 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 p2c 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 p2c to generate more correct,
- efficient, or readable code.
-
- The p2crc files contain a list of parameters, one per line.
- The system configuration file, which may be viewed using the
- -i option to p2c, serves as an example of the proper format.
- Parameter names are case-insensitive. If a parameter name
- occurs exactly once in the system p2crc, 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 p2crc options take a numeric value of 0 or 1, roughly
- corresponding to "no" or "yes." Sometimes a blank value or
- the value "def" corresponds to an intermediate "maybe"
- state. For example, the stylistic option ExtraParens
- 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 and and or
- expressions, adds "fred" to the list of names to avoid using
- in generated C code, and defines a special translation for
- the Pascal program's slope function using the standard C
- atan2 function and a constant RadDeg 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 p2crc files. Comments
- within embedded parameters are delimited by `##'. Numeric
- parameters may replace `=' with `+' or `-' to increase or
-
-
-
- - 6 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- 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}
- some declarations
- {VarFiles ## Back to original FILE * passing}
-
- causes the parameter VarFiles 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 strings module's include
- file for the rest of the translation, but the assignment of
- ExportSymbol pertains only to the module itself.
-
- For the complete list of p2crc parameters, run p2c with the
- -i option. Here are some additional comments on selected
- parameters:
-
- ImportAll Because Turbo Pascal only allows one unit per
- source file, p2c normally stops reading past
- the word implementation 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 ImportAll
- option lets you override the default behavior
- for your Pascal dialect.
-
- AnsiC This parameter selects which dialect of C to
- use. If 1, all conventions of ANSI C such as
- prototypes, void * 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 enum and void but not
- void * 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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- setting AnsiC is not enough.
-
- C++ At present p2c does not use much of C++ at
- all. The default action is to generate code
- that will compile in either language.
-
- UseVExtern 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;". P2c accomplishes this by
- declaring public variables "vextern" in
- header files, and arranging for the macro
- vextern to expand to extern or to nothing
- when appropriate. If you set UseVExtern=0
- p2c will instead declare variables in a
- simpler way that works only on UNIX-style
- linkers.
-
- UseAnyptrMacros
- Certain C reserved words have meanings which
- may vary from one C implementation to
- another. P2c uses special capitalized names
- for these words; these names are defined as
- macros in the file p2c.h which all translated
- programs include. You can set
- UseAnyptrMacros=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, UseConsts
- allows you to specify whether your target
- language recognizes the word const in
- constant declarations. The default is to use
- the Const macro instead, so that your code
- will be portable to either kind of
- implementation.
-
- Signed expands to the reserved word signed if
- that word is available, otherwise it is given
- a null definition. Similarly, Const expands
- to const if that feature is available. The
- words Volatile and Register are also defined
- in p2c.h, although p2c does not use them at
- present. The word Char expands to char by
- default, but might need to be redefined to
- signed char or unsigned char in a particular
- implementation. This is used for the Pascal
- character type; lowercase char is used when
- the desired meaning is "byte," not
- "character."
-
- The word Static always expands to static by
-
-
-
- - 8 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- default. This is used in situations where a
- function or variable is declared static to
- make it local to the source file; lowercase
- static is used for static local variables.
- Thus you can redefine Static to be null if
- you want to force private names to be public
- for purposes of debugging.
-
- The word Void expands to void in all cases;
- it is used when declaring a function with no
- return value. The word Anyptr is a typedef
- for void * or char * as necessary; it
- represents a generic pointer.
-
- UsePPMacros The p2c.h header also declares two macros for
- function prototyping, PP(x) and PV(). 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, p2c uses these macros for all
- function declarations, but function
- definitions are written in old-style C. The
- UsePPMacros parameter can be set to 0 to
- disable all use of PP and PV, 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
- PP-style declaration.) If you know your code
- will always be compiled on systems that
- support prototyping, it is prettier to set
- Prototypes=1 or simply AnsiC=1 to get true
- function prototypes.
-
- EatNotes Notes and warning messages containing any of
- these strings as sub-strings are not omitted.
- Each type of message includes an identifier
- like [145]; you can add this identifier to
- the EatNotes list to suppress that message.
-
-
-
- - 9 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- 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.,
- {EatNotes+[145]} and {EatNotes-[145]}. 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.
-
- ExpandIncludes 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 ExpandIncludes=0, p2c
- 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 StaticFunctions=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.
-
- ElimDeadCode Some transformations that p2c does on the
- program may result in unreachable or "dead"
- code. By default p2c 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
- ElimDeadCode=0.
-
- SkipIndices 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 SkipIndices 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.
-
- FoldConstants Pascal non-structured constants generally
- translate to #define's in C. Set this to 1
- to have constants instantiated directly into
-
-
-
- - 10 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- the code. This may be turned on or off
- around specific constant declarations. Set
- this to 0 to force p2c 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 p2c to take advantage of its
- knowledge of a constant's value, such as by
- generating code that assumes the constant is
- positive.
-
- CharConsts This governs whether single-character string
- literals in Pascal const declarations should
- be interpreted as characters or strings. In
- other words, const a='x'; will translate to
- #define a 'x' if CharConsts=1 (the default),
- or to #define a x if CharConsts=0. Note that
- if p2c 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, p2c will
- have to write char-to-string conversion code
- each time the constant is used.
-
- VarStrings 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 strmax
- function. You can prevent p2c from creating
- a hidden size parameter by setting
- VarString=0. (Note that each function uses
- the value of VarStrings as of the first
- declaration of the function that is parsed,
- which is often in the interface section of a
- module.)
-
- Prototypes Control whether ANSI C function prototypes
- are used. Default is according to AnsiC.
- This also controls whether to include
- parameter names or just their types in
- situations where names are optional. The
- FullPrototyping 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 PromoteArgs is used to override this.
- The CastArgs parameter controls whether
- type-casts are used in function arguments; by
-
-
-
- - 11 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- default they are used only if prototypes are
- not available.
-
- StaticLinks HP Pascal and Turbo Pascal each include the
- concept of procedure or function pointers,
- though with somewhat different syntaxes. P2c
- 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 struct 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
- StaticLinks=1. In Turbo, the default
- (StaticLinks=0) is to use plain C function
- pointers with no static links. A third
- option (StaticLinks=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).
-
- SmallSetConst 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 SetBits parameter may be used to change
- the upper limit of 31.) The SmallSetConst
- 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 long 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.
-
- ReturnValueName
- This is one of many "naming conventions"
- parameters. Most of these take the form of a
- printf-like string containing a %s where the
- relevant information should go. In the case
- of ReturnValueName, the %s refers to a
- function name and the resulting string gives
-
-
-
- - 12 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- 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 return statements cannot
- conveniently be used. Some parameters
- (ReturnValueName included) do not require the
- %s to be present in the format string; for
- example, the standard p2crc file stores every
- function's return value in a variable called
- Result.
-
- AlternateName P2c 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 putc, 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 p2c uses the parameter
- AlternateName1 to generate an alternative
- name for the symbol. The default is to add
- an underscore to the name. There is also an
- AlternateName2 parameter for a second
- alternate name, and an AlternateName
- 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, p2c
- applies AlternateName1 many times over.
-
- ExportSymbol Symbols in the interface section for a Pascal
- module are formatted according to the value
- of ExportSymbol, if any. It is not uncommon
- to use modulename_%s for this symbol; the
- default is %s, i.e., no special treatment for
- exported symbols. If you also define the
- Export_Symbol 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.
-
- Alias 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).
-
- Synonym This creates a synonym for another Pascal
-
-
-
- - 13 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- symbol or keyword. The format is
-
- Synonym old-name = new-name
-
- All occurrences of old-name in the input text
- are treated as if they were new-name by the
- parser. If new-name is a keyword, old-name
- will be an equivalent keyword. If new-name
- is the name of a predefined function, old-
- name will behave in the same way as that
- function, and so on. If new-name is omitted,
- then occurrences of old-name 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 p2c, or to
- simulate a keyword or predefined identifier
- of your dialect with a similar one that p2c
- 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 getmem procedure, you
- can make your routine a synonym for getmem
- even if you are not translating in Turbo
- mode.
-
- NameOf 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 p2crc file for
- the project. The format is
-
- NameOf pascal-name = C-name
-
- By default, Pascal names map directly onto C
- names with no change (except for the various
- kinds of formatting outlined above). If the
- pascal-name is of the form module.name or
- procedure.name 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.
-
- VarMacro This is analogous to NameOf, 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 ConstMacro parameter for translating
- constants as arbitrary expressions. Note
- that the variable on the lefthand side must
-
-
-
- - 14 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- 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, p2c will use algebra to
- "solve" for i.
-
- In all cases where p2c 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 writeln).
-
- FieldMacro Here the lefthand side must have the form
- record.field, where record is the Pascal type
- or variable name for a record, and field is a
- field in that record. The righthand side
- must be a C expression generally including
- the name record. All instances of that name
- are replaced by the actual record being
- "dotted." For example,
-
- FieldMacro Rect.topLeft = topLeft(Rect)
-
- translates a[i].topLeft into topLeft(a[i]),
- where a is an array of Rect.
-
- FuncMacro 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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- FuncMacro PtInRect(p,r) = PtInRect(p,&r)
-
- causes the second argument of PtInRect 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
- FuncMacro will not affect the definition but
- it will affect all calls to the function
- elsewhere in the module. FuncMacros can also
- be applied to predefined or never-defined
- functions.
-
- IncludeFrom 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.
-
- ImportFrom 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 ImportFrom entry is
- found for a module, the path defined by the
- ImportDir 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.pas and %s.text in the current
- directory, then for /usr/lib/p2c/%s.imp.
- (where /usr/lib/p2c is the p2c home
- directory.)
-
- StructFunction This parameter is a list of functions which
- follow the p2c 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 strcpy is an example of this
- concept. Sprintf also behaves this way in
- some dialects; it always appears on the
- StructFunction list regardless of the type of
- implementation.) The system configuration
- file includes a list of common structured
- functions so that p2c's optimizer will know
- how to manipulate them.
-
-
-
- - 16 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- StrlapFunction 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.
-
- Deterministic Functions on this list have no side effects
- or side dependencies. An example is the sin
- 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. P2c 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.
-
- LeaveAlone Functions on this list are not subjected to
- the normal built-in translation rules that
- p2c would otherwise use. For example, adding
- writeln to this list would translate writeln
- statements blindly into calls to a C
- writeln() function, rather than being
- translated into equivalent printf calls. The
- built-in translation is also suppressed if
- the function has a FuncMacro.
-
- BufferedFile P2c normally assumes binary files will use
- read/write, not get/put/^ 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 BufferedFile to force p2c to
- allocate buffers for them; do this if you get
- a warning message that says it is necessary.
- Set BufferedFile=1 to buffer all files, in
- which case UnBufferedFile allows you to force
- certain files not to have buffers.
-
- StructFiles If p2c still can't translate your file
- operations correctly, you can set
- StructFiles=1 to cause Pascal files to
- translate into structs which include the
- usual C FILE 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 p2c to do a correct
- translation in many more cases.
-
-
-
-
- - 17 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- CheckFileEOF 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 CheckFileEOF.
- These checks can make the code very ugly! If
- I/O checking is enabled by the program
- ($iocheck on$ in HP Pascal; {$I+} in Turbo;
- this is always the default state), these
- checks will generate fatal errors unless
- enclosed in an HP Pascal try-recover
- construct. If I/O checking is disabled,
- these will cause the global variable
- P_ioresult 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.
-
- ISSUES
- Integer size. P2c 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 IntSize appropriately. In particular
- setting IntSize=32 will generate much cleaner code: p2c 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
- CastLongArgs=0. (The CastArgs parameter similarly controls
- other types of casts, such as between ints and doubles.) The
- Integer16 parameter controls whether Pascal integers are
- interpreted as 16 or 32 bits, or translated as native C
- integers. The default value depends on the Language
- selected.
-
- Signed/unsigned chars. Pascal characters are normally
- "weakly" interpreted as unsigned; this is controlled by
- UnsignedChar. The default is "either," so that C's native
- char 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 {SIGNED} char and {UNSIGNED} char in the few cases
- where it really matters. These comments are controlled by
- the SignedComment and UnsignedComment parameters. (The type
- {UNSIGNED} integer is also recognized.) The SignedChar
- parameter tells whether C characters are signed or unsigned
- (default is "unknown"). The HasSignedChar parameter tells
- whether the phrase "signed char" is legal in the output. If
- it is not, p2c may have to translate Pascal signed bytes
- into C shorts.
-
- Special types. P2c understands the following predefined
- Pascal type names: integer, signed integers depending on
- Integer16; longint, signed 32-bit integers; unsigned,
-
-
-
- - 18 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- unsigned 32-bit integers; sword, signed 16-bit integers;
- word, unsigned 16-bit integers; c_int, signed native C
- integers; c_uint, unsigned native C integers; sbyte, signed
- 8-bit integers; byte, unsigned 8-bit integers; real,
- floating-point numbers depending on DoubleReals; single,
- single-precision floats; longreal, double, and extended,
- double-precision floats; pointer and anyptr, generic
- pointers (assignment-compatible with any pointer type);
- string, generic string of length StringDefault (normally
- 255); also, the usual Pascal types char, boolean, and text.
- (If your Pascal uses different names for these concepts, the
- Synonym option will come in handy.)
-
- Embedded code. It is possible to write a Pascal comment
- containing C code to be embedded into the output. See the
- descriptions of EmbedComment and its relatives in the system
- p2crc file. These techniques are helpful if you plan to do
- repeated translations of code that is still being maintained
- in Pascal.
-
- Comments and blank lines. P2c 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
- p2c will also reproduce your usage of blank lines. If the
- comment mechanism goes awry, you can disable comments with
- EatComments or disable their being attached to code with
- SpitComments.
-
- Indentation. P2c has a number of parameters to govern
- indentation of code. The default values produce the GNU
- Emacs standard indentation style, although p2c 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 p2crc file.
-
- Line breaking. P2c 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
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- the absolute maximum line length (default 90), and
- progressively greater penalties for breaking at operators
- deeply nested in expressions. Parameters such as
- OpBreakPenalty control the relative weights of various
- choices. BreakArith 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 MaxLineWidth=78.
-
- Unlike TeX, p2c'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 p2c to prune away obviously
- undesirable alternatives in advance. The MaxLineBreakTries
- parameter (default 5000) controls how many alternatives to
- try before giving up and using the best so far.
-
- PASCAL_MAIN. P2c 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 ArgCName to
- be argc, ArgVName to be argv, and MainName (normally
- "PASCAL_MAIN") to be blank. This will work if argc and argv
- are never accessed outside of your main program.
-
- BUGS
- P2c was designed with the idea that clean, readable output
- in most cases is worth more than guaranteed correct output
- in extreme cases. P2c is not a compiler! However, ideally
- the "extreme" cases would include only those which never
- arise in real life. Thus if p2c 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 try-recover structures are translated into calls
- to TRY and RECOVER macros, which are defined to simulate the
- construct using setjmp and longjmp. If this emulation does
- not work, define the symbol FAKE_TRY to cause these macros
- to become "inert." (In cases where the error is detected by
- code physically within the body of the try statement, a C
- goto to the recover section is always generated.) Also,
- local file variables in scopes which are destroyed by an
- escape are not closed.
-
-
-
- - 20 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- Non-local GOTO's and try-recover 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 p2c 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 p2c.
-
- Many aspects of Modula-2 are translated only superficially.
- For example, the type-compatibility properties of the WORD
- and ARRAY OF WORD types are only roughly modelled, as are
- the scope rules concerning modules.
-
- Parts of VAX Pascal are still untreated. In particular, the
- [UNSAFE] attribute and a few others are not fully supported,
- nor are the semantics of the OPEN procedure.
-
- Turbo and VAX Pascal's double, quadruple, and extended real
- types all translate to the C double type. Turbo's
- computational 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]:=chr(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 ord(s[0])+n, then the generated code
- will not work. In VAX Pascal this corresponds to performing
- arithmetic on the LENGTH 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 string[8] variable, the last two characters are
- silently removed. The code produced by p2c generally will
- overrun the target string instead! The StringTruncLimit
- parameter (80 by default if Language=Turbo) 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 copy in the Pascal source to truncate the
-
-
-
- - 21 - Formatted: February 28, 1991
-
-
-
-
-
-
- P2C(1) (local) P2C(1)
-
-
-
- strings explicitly.
-
- FILES
- file.xxx 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
-
- AUTHOR
- 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 p2c in countless ways.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - 22 - Formatted: February 28, 1991
-
-
-