p2c man page on Minix

Man page or keyword search:  
man Server   6208 pages
apropos Keyword Search (all sections)
Output format
Minix logo
[printable version]

P2C(1)									P2C(1)

NAME
       p2c - Pascal to C translator, version 1.20

SYNOPSIS
       p2c [ options ] [ file [ module ] ]

DESCRIPTION
       P2c  is	a tool for translating Pascal programs into C.	The input con‐
       sists 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 com‐
       prise an equivalent program in any of several dialects  of  C.	Output
       code  may  be  kept machine- and dialect-independent, or it may be tar‐
       geted to a specific machine and compiler.  Most reasonable Pascal  pro‐
       grams  are converted into fully functional C which will compile and run
       with no further modifications, although p2c sometimes chooses to gener‐
       ate 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	possi‐
       ble.   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.	Gener‐
       ated 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 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  occasion‐
       ally core dump if the input refers to undefined symbols.

       If  the input is a module, the translator will also produce a file mod‐
       ule.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 trans‐
       lated; 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/pkg/libdata/p2c/p2crc for a
       number of configuration parameters.  (The actual path used on your sys‐
       tem  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  mod‐
	      ule  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 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 num‐
	      ber/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/pkg/libdata/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/pkg/libdata/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 mod‐
	      ules 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 com‐
	      mand line if used) simply copies the system  configuration  file
	      /usr/pkg/libdata/p2c/p2crc   to	the  standard  output  in  its
	      entirety.	 (It may be used with -H, but -i is most  useful  pre‐
	      cisely when you don't know the location of the home directory.)

       -q     Quiet  mode.  Suppresses output of status messages during trans‐
	      lation.

       -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  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.	Debug‐
       ging  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 parame‐
       ters 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.

       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  edi‐
	       tion.	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  (imple‐
	       mentation  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 trans‐
	       late 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 foo.c.

       Even  if all language features are supported for a dialect, some prede‐
       fined 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	appli‐
       cations,	 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, effi‐
       cient, 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  con‐
       figuration line adds an entry.

       Many  p2crc options take a numeric value of 0 or 1, roughly correspond‐
       ing to "no" or "yes."  Sometimes a blank value or the value "def"  cor‐
       responds	 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 embed‐
       ded parameters.	The `=' sign  is  required  for	 embedded  parameters,
       though it is optional in p2crc files.  Comments within embedded parame‐
       ters are delimited by `##'.  Numeric parameters may  replace  `='  with
       `+' or `-' to increase or 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	decla‐
       rations, 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 pre‐
       ceded 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 implemen‐
		      tation 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 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  oth‐
		      ers  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 dis‐
		      able  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  por‐
		      table 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  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 debug‐
		      ging.

		      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	neces‐
		      sary; 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  dec‐
		      larations,  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.	 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  com‐
		      bining  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]" every‐
		      where.  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 pro‐
		      grams.

       FoldConstants  Pascal non-structured constants generally	 translate  to
		      #define's in C.  Set this to 1 to have constants instan‐
		      tiated directly into 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  invali‐
		      dating  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 char‐
		      acters 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 FullProto‐
		      typing 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 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  (Stati‐
		      cLinks=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 ele‐
		      ments 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 oper‐
		      ating on sets.

       ReturnValueName
		      This is one of  many  "naming  conventions"  parameters.
		      Most of these take the form of a printf-like string con‐
		      taining a %s where the relevant information  should  go.
		      In the case of ReturnValueName, the %s refers to a func‐
		      tion 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 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 verba‐
		      tim,  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 parame‐
		      ter 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 symbol or key‐
		      word.  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  key‐
		      word.  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.	  Syn‐
		      onyms  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 prede‐
		      fined  functions are available at all times; if you have
		      a library routine that behaves like,  e.g.,  Turbo  Pas‐
		      cal's getmem procedure, you can make your routine a syn‐
		      onym 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 Pas‐
		      cal  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 mod‐
		      ule.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	Const‐
		      Macro  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 Pas‐
		      cal-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 oper‐
		      ators  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 iden‐
		      tifier (built-in or defined by your  program  previously
		      to  when	the  macro definition was parsed), or an arbi‐
		      trary Pascal type expression in parentheses.  The	 left‐
		      hand  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 right‐
		      hand 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	proce‐
		      dure  name plus a parameter list.	 The number of parame‐
		      ters 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 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	 func‐
		      tions.

       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 gener‐
		      ated 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 direc‐
		      tory,  then  for	/usr/pkg/libdata/p2c/%s.imp.	(where
		      /usr/pkg/libdata/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  con‐
		      cept.   Sprintf  also behaves this way in some dialects;
		      it always appears on the StructFunction list  regardless
		      of  the  type of implementation.)	 The system configura‐
		      tion file includes a list of common structured functions
		      so  that	p2c's  optimizer  will	know how to manipulate
		      them.

       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	 read‐
		      ability.	 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  sup‐
		      pressed 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 cor‐
		      rectly, 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  cor‐
		      rect translation in many more cases.

       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 Check‐
		      FileEOF.	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 vari‐
		      able 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 Int‐
       Size 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  Cas‐
       tArgs  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"	inter‐
       preted 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 mat‐
       ters.  These comments are controlled by the SignedComment and Unsigned‐
       Comment	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,  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 inte‐
       gers; 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 EmbedCom‐
       ment 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 num‐
       bers 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  the  absolute	 maximum  line	length
       (default 90), and progressively greater penalties for breaking at oper‐
       ators 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 con‐
       tributed at each decision point must sum to a nonnegative value;	 nega‐
       tive  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	 "PAS‐
       CAL_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 actu‐
       ally 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-dimen‐
       sional  conformant  arrays)  produce code that declares variable-length
       arrays in C.  Only a few C compilers, such as the GNU C compiler,  sup‐
       port  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	state‐
       ment,  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.

       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'	 vari‐
       ables  are  occasionally omitted by mistake, if the access is too indi‐
       rect for p2c to notice.	If this happens, you can add an explicit  ref‐
       erence  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 exam‐
       ple, the type-compatibility properties of the WORD and  ARRAY  OF  WORD
       types are only roughly modelled, as are the scope rules concerning mod‐
       ules.

       Parts of VAX Pascal are still untreated.	 In particular,	 the  [UNSAFE]
       attribute  and a few others are not fully supported, nor are the seman‐
       tics 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 sup‐
       ported 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 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/pkg/libdata/p2c/p2crc system-wide configuration file
       /usr/pkg/libdata/p2c/system.impdeclarations for predefined functions
       /usr/pkg/libdata/p2c/system.m2analogous declarations for Modula-2
       /usr/pkg/libdata/p2c/*.imp interface text for standard modules
       /usr/pkg/include/p2c/p2c.h header file for translated programs
       /usr/pkg/lib/p2c/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  Schnei‐
       der,  and  others whose suggestions and bug reports have helped improve
       p2c in countless ways.

				     local				P2C(1)
[top]

List of man pages available for Minix

Copyright (c) for man pages and the logo by the respective OS vendor.

For those who want to learn more, the polarhome community provides shell access and support.

[legal] [privacy] [GNU] [policy] [cookies] [netiquette] [sponsors] [FAQ]
Tweet
Polarhome, production since 1999.
Member of Polarhome portal.
Based on Fawad Halim's script.
....................................................................
Vote for polarhome
Free Shell Accounts :: the biggest list on the net