PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) NNNNAAAAMMMMEEEE p2c - Pascal to C translator, version 1.12 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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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=} {*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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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: March 2, 1990 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. 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 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 - 11 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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 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 - 12 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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 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 - 13 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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 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 - 14 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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, 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. - 15 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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. 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 - 16 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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. 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 - 17 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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, 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 - 18 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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 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. - 19 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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. 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 - 20 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) 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 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.caltech.edu. Many thanks to William Bader, Rick Koshi, Eric Raymond, Magne Haveraaen, Dirk Grunwald, David Barto, Paul Fisher, and others whose suggestions and bug reports have helped - 21 - Formatted: March 2, 1990 PPPP2222CCCC((((1111)))) ((((llllooooccccaaaallll)))) PPPP2222CCCC((((1111)))) improve _p_2_c in countless ways. - 22 - Formatted: March 2, 1990