home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume21 / p2c / part18 < prev    next >
Text File  |  1990-04-05  |  50KB  |  1,549 lines

  1. Subject:  v21i063:  Pascal to C translator, Part18/32
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 9f2f4d5e 2dd11476 631da2e1 db86d191
  5.  
  6. Submitted-by: Dave Gillespie <daveg@csvax.caltech.edu>
  7. Posting-number: Volume 21, Issue 63
  8. Archive-name: p2c/part18
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 18 (of 32)."
  17. # Contents:  src/p2c.man
  18. # Wrapped by rsalz@litchi.bbn.com on Mon Mar 26 14:29:41 1990
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'src/p2c.man' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'src/p2c.man'\"
  22. else
  23. echo shar: Extracting \"'src/p2c.man'\" \(46517 characters\)
  24. sed "s/^X//" >'src/p2c.man' <<'END_OF_FILE'
  25. X.\" p2c  Copyright 1989 Dave Gillespie
  26. X.TH P2C 1 "local"
  27. X.SH NAME
  28. Xp2c \- Pascal to C translator, version 1.14
  29. X.SH SYNOPSIS
  30. X.B p2c
  31. X[ options ] [ file [ module ] ]
  32. X.SH DESCRIPTION
  33. X.I P2c
  34. Xis a tool for translating Pascal programs into C.  The input consists
  35. Xof a set of source files in any of the following Pascal dialects:
  36. XHP Pascal, Turbo/UCSD Pascal, DEC VAX Pascal, Oregon Software Pascal/2,
  37. XMacintosh Programmer's Workshop Pascal, Sun/Berkeley Pascal.
  38. XModula-2 syntax is also supported.  Output is a set of
  39. X.B .c
  40. Xand
  41. X.B .h
  42. Xfiles that comprise an equivalent program in any of several dialects
  43. Xof C.  Output code may be kept machine- and dialect-independent, or
  44. Xit may be targeted to a specific machine and compiler.  Most reasonable
  45. XPascal programs are converted into fully functional C which will compile
  46. Xand run with no further modifications, although
  47. X.I p2c
  48. Xsometimes chooses to generate readable code at the expense of absolute
  49. Xgenerality.  
  50. X.I P2c
  51. Xendeavors to insert notes and warning messages into the output code
  52. Xto point out areas which may require human intervention.  Output code
  53. Xis arranged to be readable and efficient, and to make use of C idioms
  54. Xwherever possible.  The main goal of the translation is to produce C
  55. Xfiles which are pleasant and "natural" enough to be acceptable as the new
  56. Xsource files for a program.  In a pinch,
  57. X.I p2c
  58. Xwill also serve as an ad hoc Pascal compiler.
  59. X.PP
  60. XCode generated by
  61. X.I p2c
  62. Xnormally does not assume characters are signed or unsigned.
  63. XAlso, it assumes
  64. X.B int
  65. Xis the same as either
  66. X.B short
  67. Xor
  68. X.B long
  69. Xbut does not depend on which.  However, if
  70. X.B int
  71. Xis not the same as
  72. X.BR long
  73. Xit is best to use a modern C compiler which supports prototypes.
  74. XGenerated code does not require an ANSI-compatible compiler
  75. X(unless ANSI-style code is requested), but it does use various
  76. XANSI-standard library routines.
  77. X.PP
  78. XAll generated code includes the file
  79. X.I <p2c/p2c.h>
  80. Xwhich in turn includes
  81. X.I <stdio.h>
  82. Xand various other common resources.  Also, many translated programs
  83. Xwill need to be linked with the run-time library, typically
  84. X.I -lp2c.
  85. X.PP
  86. XGiven a file name,
  87. X.I p2c
  88. Xreads from the specified file and outputs to a file with a
  89. X.B .c
  90. Xsuffix added or substituted.  For example,
  91. X.IP "" 5
  92. Xp2c myfile.pas
  93. X.PP
  94. Xreads from
  95. X.I myfile.pas
  96. Xto produce the file
  97. X.I myfile.c.
  98. XThe input file may contain a Pascal main program or a
  99. Xsingle Pascal module (or "unit" in Turbo and UCSD Pascal nomenclature),
  100. Xor it may just contain a number of procedures and declarations.
  101. X.I P2c
  102. Xis designed to work for correct input programs.  That is, it will accept
  103. Xpartial programs but may occasionally core dump if the input refers to
  104. Xundefined symbols.
  105. X.PP
  106. XIf the input is a module, the translator will also produce a file
  107. X.IB module .h
  108. Xcontaining a translation of the module's interface section.
  109. XThe implementation section may be omitted in which case only the
  110. X.B .h
  111. Xfile will be interesting.  If the program or module has include files,
  112. Xthese may cause additional
  113. X.B .c
  114. Xfiles to be generated depending on the value of the
  115. X.B ExpandIncludes
  116. Xoption (see below).
  117. X.PP
  118. XIf no file name is given,
  119. X.I p2c
  120. Xreads Pascal from the standard input and writes the resulting C to
  121. Xstandard output (though a
  122. X.B .h
  123. Xfile may still be produced).  If a file name and module name are given,
  124. Xthe file may include several modules (or units).  The specified module
  125. Xis translated; any others are skipped.  The output files will be named
  126. X.IB module .c
  127. Xand
  128. X.IB module .h .
  129. X.I P2c
  130. Xnever translates more than one module per run.
  131. X.PP
  132. XBefore starting,
  133. X.I p2c
  134. Xreads the file
  135. X.I --HOMEDIR--/p2crc
  136. Xfor a number of configuration parameters.  (The actual path used on your
  137. Xsystem may vary.  The
  138. X.B \-i
  139. Xoption is a handy way to examine this file.)
  140. XIf the P2CRC environment variable is set, it gives the name of a file
  141. Xto read instead of the system file; this file can start with
  142. X.B Include %H/p2crc
  143. Xto include the system file.  Next,
  144. X.I p2c
  145. Xattempts to read the file
  146. X.I p2crc
  147. Xin your directory for further configuration.  If this file does not
  148. Xexist,
  149. X.I p2c
  150. Xlooks for
  151. X.I .p2crc
  152. Xinstead.
  153. X.SH OPTIONS
  154. X.TP
  155. X.BI \-o "\ cfile"
  156. XUse
  157. X.I cfile
  158. Xin place of
  159. X.IB file .c
  160. Xor
  161. X.IB module .c
  162. Xas the primary output file.  A single dash (`\-o \-') says to write the
  163. XC code to the standard output.
  164. X.TP
  165. X.BI \-h "\ hfile"
  166. XUse
  167. X.I hfile
  168. Xin place of
  169. X.IB module .h
  170. Xas the output file for interface text.  This only has effect if the
  171. Xinput is an HP Pascal module or a Turbo Pascal unit.
  172. X.TP
  173. X.BI \-s "\ sfile"
  174. XRead interface text from
  175. X.I sfile
  176. Xbefore beginning the translation.  This file typically contains one or
  177. Xmore modules, often with interface sections omitted for speed, which the
  178. Xprogram or module being translated will use.  (Typically the
  179. X.B ImportFrom
  180. Xand
  181. X.B ImportDir
  182. Xparameters in
  183. X.I p2crc
  184. Xare set up to allow
  185. X.I p2c
  186. Xto locate interface text without needing any
  187. X.B \-s
  188. Xoptions.)  If there are several
  189. X.B \-s
  190. Xoptions in the command, the
  191. X.I sfiles
  192. Xare read from left to right.
  193. X.TP
  194. X.BI \-p n
  195. XDisplay progress of translation in the form of a line number/file name
  196. Xdisplay.  This is refreshed every
  197. X.I n
  198. Xlines, 25 by default.
  199. X.TP
  200. X.BI \-c "\ rcfile"
  201. XRead local configuration commands from
  202. X.I rcfile
  203. Xinstead of
  204. X.I p2crc
  205. Xor
  206. X.I .p2crc.
  207. XA dash (`\-c \-') in place of
  208. X.I rcfile
  209. Xcauses no local configuration file to be used.
  210. X.TP
  211. X.B \-v
  212. X("Vanilla.")  Do not read from the system configuration file
  213. X.I --HOMEDIR--/p2crc.
  214. XSince some of the parameters in this file are required, your local
  215. Xconfiguration file must include those parameters instead.  This
  216. Xalso suppresses the file named by the P2CRC environment variable.
  217. X.TP
  218. X.BI \-H "\ homedir"
  219. XUse
  220. X.I homedir
  221. Xinstead of
  222. X.I --HOMEDIR--
  223. Xas the
  224. X.I p2c
  225. Xhome directory.  The system
  226. X.I p2crc
  227. Xfile will be searched for in this directory. 
  228. X.TP
  229. X.BI \-I pattern
  230. XAdd
  231. X.I pattern
  232. Xto the
  233. X.B ImportDir
  234. Xsearch list of places to find modules which are imported.  The pattern
  235. Xshould include a
  236. X.I %s
  237. Xto represent the module name, and should evaluate to a potential file name
  238. Xfor that module's source code.  For example,
  239. X.B ../%s.pas
  240. Xlooks for
  241. X.IB modulename .pas
  242. Xin the parent of the current directory.
  243. X.TP
  244. X.B \-i
  245. XThis special option (which must be the only argument on the
  246. Xcommand line if used) simply copies the system configuration
  247. Xfile
  248. X.I --HOMEDIR--/p2crc
  249. Xto the standard output in its entirety.  (It may be used with
  250. X.BR \-H ,
  251. Xbut
  252. X.B \-i
  253. Xis most useful precisely when you don't know the
  254. Xlocation of the home directory.)
  255. X.TP
  256. X.B \-q
  257. XQuiet mode.  Suppresses output of status messages during translation.
  258. X.TP
  259. X.BI \-E n
  260. XAbort translation after
  261. X.I n
  262. Xerrors.  If
  263. X.I n
  264. Xis omitted it defaults to zero, which means unlimited errors are allowed.
  265. XUse
  266. X.B -E1
  267. Xto make
  268. X.I p2c
  269. Xhalt after the first error.
  270. X.TP
  271. X.B \-e
  272. XEcho the Pascal source into the output file, surrounded by #ifdefs.
  273. XThis is the same as the
  274. X.B CopySource
  275. Xparameter in the
  276. X.I p2crc
  277. Xfile.
  278. X.TP
  279. X.B \-a
  280. XProduce modern ANSI C.  This is a convenient override for the
  281. X.B AnsiC
  282. Xparameter in the
  283. X.I p2crc
  284. Xfile.
  285. X.TP
  286. X.BI \-L "\ language"
  287. XSelect input language name, such as VAX or TURBO.  This is a convenient
  288. Xoverride for the
  289. X.B Language
  290. Xparameter.
  291. X.TP
  292. X.B \-V
  293. XVerbose mode.  This causes
  294. X.I p2c
  295. Xto generate an additional ".log" file with further details of the
  296. Xtranslation, such as a list of warnings and notes including those
  297. Xwhich are suppressed in the regular output.
  298. X.TP
  299. X.B \-M0
  300. XDisable memory conservation.  This prevents
  301. X.I p2c
  302. Xfrom freeing various data structures after translating each function,
  303. Xin case this new conservation feature causes unforseen problems.
  304. X.TP
  305. X.B \-R
  306. XRegression testing mode.  Formats notes and warning messages in a way
  307. Xthat makes it easier to run
  308. X.IR diff (1)
  309. Xon the output of
  310. X.I p2c.
  311. X.PP
  312. X.I P2c
  313. Xalso understands a few debugging options which may occasionally be
  314. Xuseful when tracking down translation problems.  The
  315. X.BI \-d n
  316. Xoption sets the "debug level" to
  317. X.I n,
  318. Xa small integer which is normally zero.  Debugging output is
  319. Xwritten into the regular output file along with the C code; the
  320. Xhigher your
  321. X.I n,
  322. Xthe more "wallpaper" you get.  Also,
  323. X.B \-t
  324. Xprints debugging information at every Pascal token,
  325. X.BI \-B n
  326. Xenables line-breaker debugging, and
  327. X.BI \-C n
  328. Xenables comment placement debugging.
  329. X.SH CHOICE OF SOURCE LANGUAGE
  330. XThe
  331. X.B Language
  332. Xconfiguration parameter or
  333. X.B \-L
  334. Xcommand-line option tells
  335. X.I p2c
  336. Xwhich Pascal dialect to expect in the input file.  Any language features
  337. Xwhich do not overlap between dialects are supported all of the time.  The
  338. X.B Language
  339. Xparameter is consulted when a syntax or usage is detected that has different
  340. Xmeanings in two different dialects, and also to determine default values
  341. Xfor various other translation parameters as described below.
  342. X.PP
  343. XThe following language words are supported by
  344. X.I p2c.
  345. XNames are case-insensitive.
  346. X.TP 8
  347. X.B HP
  348. XHP Pascal.  This is the default language.  All features of HP Standard
  349. XPascal, the Pascal Workstation version, are supported except as noted
  350. Xin BUGS below.  Some features of MODCAL, HP's extended Pascal, are also
  351. Xsupported.  This is a superset of ISO standard Pascal, including
  352. Xconformant arrays and procedural parameters.
  353. X.TP
  354. X.B HP-UX
  355. XHP Pascal, HP-UX version.  Almost identical to the "HP" dialect.
  356. X.TP
  357. X.B Turbo
  358. XTurbo Pascal 5.0 for the IBM PC.  Few conflicts with HP Pascal, so the
  359. X.B Language
  360. Xparameter is not often needed for Turbo.  (Most important is that the Turbo
  361. Xand HP dialects use 16 and 32 bit integers, respectively.)
  362. X.TP
  363. X.B UCSD
  364. XUCSD Pascal.  Similar to Turbo in many ways.
  365. X.TP
  366. X.B MPW
  367. XMacintosh Programmer's Workshop Pascal 2.0.  Should also do a pretty
  368. Xgood job for Lightspeed Pascal.  Object Pascal features are not supported,
  369. Xnor is the fact that
  370. X.B char
  371. Xvariables are sometimes stored in 16 bits.
  372. X.TP
  373. X.B VAX
  374. XVAX/VMS Pascal version 3.5.  Most but not all language features supported.
  375. XThis has not yet been tested on large programs.
  376. X.TP
  377. X.B Oregon
  378. XOregon Software Pascal/2.  All features implemented.
  379. X.TP
  380. X.B Berk
  381. XBerkeley Pascal with Sun extensions.
  382. X.TP
  383. X.B Modula
  384. XModula-2.  Based on Wirth's
  385. X.I Programming in Modula-2,
  386. X3rd edition.  Proper setting of the
  387. X.B Language
  388. Xparameter is
  389. X.I not
  390. Xoptional.  Translation will be incomplete in most cases, but should be
  391. Xgood enough to work with.  Structure of local sub-modules is essentially
  392. Xignored; like-named identifiers may be confused.  Type WORD is translated
  393. Xas an integer, but type ADDRESS is translated as char * or void *; this
  394. Xmay cause inconsistencies in the output code.
  395. X.IP
  396. XModula-2 modules have two parts in separate files.  Suppose these are
  397. Xcalled
  398. X.I foo.def
  399. X(definition part) and
  400. X.I foo.mod
  401. X(implementation part) for module
  402. X.I foo.
  403. XThen a pattern like
  404. X.B %s.def
  405. Xmust be included in the
  406. X.B ImportDir
  407. Xlist, and
  408. X.B LibraryFile
  409. Xmust be changed to refer to
  410. X.I system.m2
  411. Xinstead of
  412. X.I system.imp.
  413. XTo translate the definition part, give the command
  414. X.IP
  415. X\ \ \ \ \ p2c foo.def
  416. X.IP
  417. Xto translate the definition part into files
  418. X.I foo.h
  419. Xand
  420. X.IR foo.c ;
  421. Xthe latter will usually be empty.  The command
  422. X.IP
  423. X\ \ \ \ \ p2c -s foo.def foo.mod
  424. X.IP
  425. Xwill translate the implementation part into file
  426. X.I foo.c.
  427. X.PP
  428. XEven if all language features are supported for a dialect, some
  429. Xpredefined functions may be omitted.  In these cases, the function call
  430. Xwill be translated literally into C with a warning.  Some hand modification
  431. Xmay be required.
  432. X.SH CONFIGURATION PARAMETERS
  433. X.I P2c
  434. Xis highly configurable.  The defaults are suitable for most applications,
  435. Xbut customizing these parameters will help you get the best possible
  436. Xtranslation.  Since the output of
  437. X.I p2c
  438. Xis intended to be used as human-maintainable source code, there are many
  439. Xparameters for describing the coding style and conventions you prefer.
  440. XOthers give hints about your program that help
  441. X.I p2c
  442. Xto generate more correct, efficient, or readable code.
  443. X.PP
  444. XThe
  445. X.I p2crc
  446. Xfiles contain a list of parameters, one per line.  The system
  447. Xconfiguration file, which may be viewed using the
  448. X.B \-i
  449. Xoption to
  450. X.I p2c,
  451. Xserves as an example of the proper format.  Parameter names are
  452. Xcase-insensitive.  If a parameter name occurs exactly once in the system
  453. X.I p2crc,
  454. Xthis indicates that it must have a unique value and the last value given to
  455. Xit by the
  456. Xconfiguration files is used.  Other parameters are written several times
  457. Xin a row; these are lists to which each configuration line adds an entry.
  458. X.PP
  459. XMany
  460. X.I p2crc
  461. Xoptions take a numeric value of 0 or 1, roughly corresponding to
  462. X"no" or "yes."  Sometimes a blank value or the value "\fBdef\fR"
  463. Xcorresponds to an intermediate "maybe" state.  For example, the stylistic
  464. Xoption
  465. X.B ExtraParens
  466. Xswitches between copious or minimal parentheses in expressions, with
  467. Xthe default being a nice compromise intended to be best for readers
  468. Xwith an average knowledge of C operator precedences.
  469. X.PP
  470. XConfiguration options may also be embedded in the source file in the
  471. Xform of Pascal comments:
  472. X.PP
  473. X\ \ \ \ \ {ShortOpt=0} {AvoidName=fred}
  474. X.br
  475. X\ \ \ \ \ {FuncMacro slope(x,y)=atan2(y,x)*RadDeg}
  476. X.PP
  477. Xdisables automatic short-circuiting of
  478. X.B and
  479. Xand
  480. X.B or
  481. Xexpressions, adds "\fIfred\fR" to the list of names to avoid using in
  482. Xgenerated C code, and defines a special translation for the Pascal
  483. Xprogram's
  484. X.I slope
  485. Xfunction 
  486. Xusing the standard C
  487. X.I atan2
  488. Xfunction and a constant
  489. X.I RadDeg
  490. Xpresumably defined in the program.  Whitespace is generally not allowed
  491. Xin embedded parameters.
  492. XThe `=' sign is required for embedded parameters, though it is optional in
  493. X.I p2crc
  494. Xfiles.  Comments within embedded parameters are delimited by `##'.
  495. XNumeric parameters may replace `=' with `+' or `-' to increase
  496. Xor decrease the parameter; list-based parameters may use `-' to remove
  497. Xa name from a list rather than adding it.  Also, the parameter name
  498. Xby itself in comment braces means to restore the parameter's value
  499. Xthat was current before the last change:
  500. X.PP
  501. X\ \ \ \ \ {VarFiles=0  ## Pass FILE *'s params by value even if VAR}
  502. X.br
  503. X.I \ \ \ \ \ some declarations
  504. X.br
  505. X\ \ \ \ \ {VarFiles    ## Back to original FILE * passing}
  506. X.PP
  507. Xcauses the parameter
  508. X.B VarFiles
  509. Xto have the value 0 for those few declarations, without affecting the
  510. Xparameter's value elsewhere in the file.
  511. X.PP
  512. XIf an embedded parameter appears in an include file or in interface text
  513. Xfor a module,
  514. Xthe effect of the assignment normally carries over to any programs that
  515. Xincluded that file.  If the parameter name is preceded by a `*', then
  516. Xthe assignment is automatically undone after the source file that contains
  517. Xit ends:
  518. X.PP
  519. X\ \ \ \ \ {IncludeFrom strings=<p2c/strings.h>}
  520. X.br
  521. X\ \ \ \ \ {*ExportSymbol=pascal_%s}
  522. X.br
  523. X\ \ \ \ \ module strings;
  524. X.PP
  525. Xwill record the location of the
  526. X.I strings
  527. Xmodule's include file for the rest of the translation, but the assignment
  528. Xof
  529. X.B ExportSymbol
  530. Xpertains only to the module itself.
  531. X.PP
  532. XFor the complete list of
  533. X.I p2crc
  534. Xparameters, run
  535. X.I p2c
  536. Xwith the
  537. X.B \-i
  538. Xoption.  Here are some additional comments on selected parameters:
  539. X.TP 15
  540. X.B ImportAll
  541. XBecause Turbo Pascal only allows one unit per source file,
  542. X.I p2c
  543. Xnormally stops reading past the word
  544. X.I implementation
  545. Xin a file being scanned for interface text.  But HP Pascal allows several
  546. Xmodules per file and so this would not be safe to do.  The
  547. X.B ImportAll
  548. Xoption lets you override the default behavior for your Pascal dialect.
  549. X.TP
  550. X.B AnsiC
  551. XThis parameter selects which dialect of C to use.  If 1, all conventions
  552. Xof ANSI C such as prototypes,
  553. X.B void *
  554. Xpointers, etc. are used.  If 0, only strict K&R (first edition) C is used.
  555. XThe default is to use "traditional UNIX C," which includes
  556. X.B enum
  557. Xand
  558. X.B void
  559. Xbut not
  560. X.B void *
  561. Xor prototypes.  Once again there are a number of other parameters which
  562. Xmay be used to control the individual features if just setting
  563. X.B AnsiC
  564. Xis not enough.
  565. X.TP
  566. X.B C++
  567. XAt present
  568. X.I p2c
  569. Xdoes not use much of C++ at all.  The default action is to generate code
  570. Xthat will compile in either language.
  571. X.TP
  572. X.B UseVExtern
  573. XMany non-UNIX linkers prohibit variables from being defined (not declared)
  574. Xby more than one source file.  One module must declare, e.g., "int foo;",
  575. Xand all others must declare "extern int foo;".
  576. X.I P2c
  577. Xaccomplishes this by declaring public variables "\fBvextern\fR"
  578. Xin header files, and arranging for the macro
  579. X.B vextern
  580. Xto expand to
  581. X.B extern
  582. Xor to nothing when appropriate.  If you set
  583. X.BR UseVExtern =0
  584. X.I p2c
  585. Xwill instead declare variables in a simpler way that works only on
  586. XUNIX-style linkers.
  587. X.TP
  588. X.B UseAnyptrMacros
  589. XCertain C reserved words have meanings which may vary from one C
  590. Ximplementation to another.
  591. X.I P2c
  592. Xuses special capitalized names for these words; these names are
  593. Xdefined as macros in the file
  594. X.I p2c.h
  595. Xwhich all translated programs include.  You can set
  596. X.BR UseAnyptrMacros =0
  597. Xto disable the use of these macros.  Note that the functions of many of
  598. Xthese macros can also be had directly using other parameters; for example,
  599. X.B UseConsts
  600. Xallows you to specify whether your target language recognizes the word
  601. X.B const
  602. Xin constant declarations.  The default is to use the
  603. X.B Const
  604. Xmacro instead, so that your code will be portable to either kind of
  605. Ximplementation.
  606. X.IP
  607. X.B Signed
  608. Xexpands to the reserved word
  609. X.B signed
  610. Xif that word is available, otherwise it is given a null definition.
  611. XSimilarly,
  612. X.B Const
  613. Xexpands to
  614. X.B const
  615. Xif that feature is available.  The words
  616. X.B Volatile
  617. Xand
  618. X.B Register
  619. Xare also defined in
  620. X.I p2c.h,
  621. Xalthough
  622. X.I p2c
  623. Xdoes not use them at present.  The word
  624. X.B Char
  625. Xexpands to
  626. X.B char
  627. Xby default, but might need to be redefined to
  628. X.B signed char
  629. Xor
  630. X.B unsigned char
  631. Xin a particular implementation.  This is used for the Pascal character
  632. Xtype; lowercase
  633. X.B char
  634. Xis used when the desired meaning is "byte," not "character."
  635. X.IP
  636. XThe word
  637. X.B Static
  638. Xalways expands to
  639. X.B static
  640. Xby default.  This is used in situations where a function or variable is
  641. Xdeclared static to make it local to the source file; lowercase
  642. X.B static
  643. Xis used for static local variables.  Thus you can redefine
  644. X.B Static
  645. Xto be null if you want to force private names to be public for purposes
  646. Xof debugging.
  647. X.IP
  648. XThe word
  649. X.B Void
  650. Xexpands to
  651. X.B void
  652. Xin all cases; it is used when declaring a function with no return value.
  653. XThe word
  654. X.B Anyptr
  655. Xis a typedef for
  656. X.B void *
  657. Xor
  658. X.B char *
  659. Xas necessary; it represents a generic pointer.
  660. X.TP
  661. X.B UsePPMacros
  662. XThe
  663. X.I p2c.h
  664. Xheader also declares two macros for function prototyping,
  665. X.BR PP (x)
  666. Xand
  667. X.BR PV ().
  668. XThese macros are used as follows:
  669. X.IP
  670. X\ \ \ \ \ Void foo  PP( (int x, int y, Char *z) );
  671. X.br
  672. X\ \ \ \ \ Char *bar PV( );
  673. X.IP
  674. XIf prototypes are available, these macros will expand to
  675. X.IP
  676. X\ \ \ \ \ Void foo  (int x, int y, Char *z);
  677. X.br
  678. X\ \ \ \ \ Char *bar (void);
  679. X.IP
  680. Xbut if only old-style declarations are supported, you instead get
  681. X.IP
  682. X\ \ \ \ \ Void foo  ();
  683. X.br
  684. X\ \ \ \ \ Char *bar ();
  685. X.IP
  686. XBy default,
  687. X.I p2c
  688. Xuses these macros for all function declarations, but function
  689. X.I definitions
  690. Xare written in old-style C.  The
  691. X.B UsePPMacros
  692. Xparameter can be set to 0 to disable all use of
  693. X.B PP
  694. Xand
  695. X.BR PV ,
  696. Xor it can be set to 1 to use the macros even when defining a function.
  697. X(This is accomplished by preceding each old-style definition with a
  698. X.BR PP -style
  699. Xdeclaration.)  If you know your code will always be
  700. Xcompiled on systems that support prototyping, it is prettier to set
  701. X.BR Prototypes =1
  702. Xor simply
  703. X.BR AnsiC =1
  704. Xto get true function prototypes.
  705. X.TP
  706. X.B EatNotes
  707. XNotes and warning messages containing any of these strings as sub-strings
  708. Xare not omitted.  Each type of message includes an identifier like
  709. X.BR [145] ;
  710. Xyou can add this identifier to the
  711. X.B EatNotes
  712. Xlist to suppress that message.  Another useful form is to use a variable
  713. Xname or other identifier to suppress warnings about that variable.  The
  714. Xstrings are a space-separated list, and thus may not contain embedded spaces.
  715. XTo suppress notes around a section of code, use, e.g.,
  716. X.I {EatNotes+[145]}
  717. Xand
  718. X.I {EatNotes-[145]}.
  719. XMost notes are generated during parsing, but to suppress those generated
  720. Xduring output the string may need to remain in the list far beyond the point
  721. Xwhere it appears to be generated.  Use the string "1" or "0" to disable or
  722. Xenable all notes, respectively.
  723. X.TP
  724. X.B ExpandIncludes
  725. XThe default action is to expand Pascal include files in-line.  This
  726. Xmay not be desirable if include files are being used to simulate modules.
  727. XWith
  728. X.BR ExpandIncludes =0,
  729. X.I p2c
  730. Xattempts to convert include files containing only whole procedures and
  731. Xglobal declarations into analogous C include files.  This may not always
  732. Xwork, though; if you get error messages, don't use this option.  By
  733. Xcombining this option with
  734. X.BR StaticFunctions =0,
  735. Xthen doing some fairly minor editing on the result, you can convert
  736. Xa pseudo-modular Pascal program into a truly modular collection of C
  737. Xsource files.
  738. X.TP
  739. X.B ElimDeadCode
  740. XSome transformations that
  741. X.I p2c
  742. Xdoes on the program may result in unreachable or "dead" code.  By
  743. Xdefault
  744. X.I p2c
  745. Xremoves such code, but sometimes it removes more than it should.
  746. XIf you have "if false" segments which you wish to retain in C, you
  747. Xmay have to set
  748. X.BR ElimDeadCode =0.
  749. X.TP
  750. X.B SkipIndices
  751. XNormally Pascal arrays not based at zero are "shifted" down for C,
  752. Xpreserving the total size of the array.  A Pascal array a[2..10] is
  753. Xtranslated to a C array a[9] with references like "a[i]" changed to
  754. X"a[i-2]" everywhere.  If
  755. X.B SkipIndices
  756. Xis set to a value of 2 or higher, this array would instead be translated
  757. Xto a[11] with the first two elements never used.  This arrangement may
  758. Xgenerate incorrect code, though, for tricky source programs.
  759. X.TP
  760. X.B FoldConstants
  761. XPascal non-structured constants generally translate to
  762. X.BR #define 's
  763. Xin C.  Set this to 1 to have constants instantiated directly into the
  764. Xcode.  This may be turned on or off around specific constant declarations.
  765. XSet this to 0 to force
  766. X.I p2c
  767. Xto make absolutely no assumptions about the constant's value in generated
  768. Xcode, so that you can change the constant later in the C code without
  769. Xinvalidating the translation.  The default is to allow
  770. X.I p2c
  771. Xto take advantage of its knowledge of a constant's value, such as by
  772. Xgenerating code that assumes the constant is positive.
  773. X.TP
  774. X.B VarStrings
  775. XIn HP Pascal, a parameter of the form "var s : string" will match a
  776. Xstring variable of any size; a hidden size parameter is passed which
  777. Xmay be accessed by the Pascal
  778. X.I strmax
  779. Xfunction.  You can prevent
  780. X.I p2c
  781. Xfrom creating a hidden size parameter by setting
  782. X.BR VarString =0.
  783. X(Note that each function uses the value of
  784. X.B VarStrings
  785. Xas of the
  786. X.I first
  787. Xdeclaration of the function that is parsed, which is often in the interface
  788. Xsection of a module.)
  789. X.TP
  790. X.B Prototypes
  791. XControl whether ANSI C function prototypes are used.  Default is according to
  792. X.BR AnsiC .
  793. XThis also controls whether to include parameter names or just their types
  794. Xin situations where names are optional.  The
  795. X.B FullPrototyping
  796. Xparameter allows prototypes to be generated for declarations but not
  797. Xfor definitions (older versions of Lightspeed C required this).  If you
  798. Xuse a mixture of prototypes and old-style definitions, types like short
  799. Xand float will be promoted to int and double as required by the ANSI
  800. Xstandard, unless
  801. X.B PromoteArgs
  802. Xis used to override this.  The
  803. X.B CastArgs
  804. Xparameter controls whether type-casts are used in function arguments;
  805. Xby default they are used only if prototypes are not available.
  806. X.TP
  807. X.B StaticLinks
  808. XHP Pascal and Turbo Pascal each include the concept of procedure or
  809. Xfunction pointers, though with somewhat different syntaxes.
  810. X.I P2c
  811. Xrecognizes both notational styles.  Another difference is that HP's
  812. Xprocedure pointers can point to nested procedures, while Turbo's can
  813. Xpoint only to global procedures.  In HP Pascal a procedure pointer must
  814. Xbe stored as a
  815. X.B struct
  816. Xcontaining both a pure C function pointer and a "static link," a pointer
  817. Xto the parent procedure's locals.  (The static link is NULL for global
  818. Xprocedures.)  This notation can be forced by setting
  819. X.BR StaticLinks =1.
  820. XIn Turbo, the default
  821. X.RB ( StaticLinks =0)
  822. Xis to use plain C function pointers with no static links.  A third option
  823. X.RB ( StaticLinks =2)
  824. Xuses structures with static links, but assumes the links are always NULL
  825. Xwhen calling through a pointer (if you need compatibility with the HP
  826. Xformat but know your procedures are global).
  827. X.TP
  828. X.B SmallSetConst
  829. XPascal sets are translated into one of two formats, depending on the size
  830. Xof the set.  If all elements have ordinal values in the range 0..31, the
  831. Xset is translated as a single integer variable using bit operations.
  832. X(The
  833. X.B SetBits
  834. Xparameter may be used to change the upper limit of 31.)
  835. XThe
  836. X.B SmallSetConst
  837. Xparameter controls whether these small-sets are used, and, if so, how
  838. Xconstant sets should be represented in C.
  839. X.IR
  840. XFor larger sets, an array of
  841. X.B long
  842. Xis used.  The
  843. X.IR s [0]
  844. Xelement contains the number of succeeding array elements
  845. Xwhich are in use.  Set elements in the range 0..31 are stored in the
  846. X.IR s [1]
  847. Xarray element, and so on.  Sets are normalized so that
  848. X.IR s [ s [0]]
  849. Xis nonzero for any nonempty set.  The standard run-time library
  850. Xincludes all the necessary procedures for operating on sets.
  851. X.TP
  852. X.B ReturnValueName
  853. XThis is one of many "naming conventions" parameters.  Most of these
  854. Xtake the form of a
  855. X.IR printf -like
  856. Xstring containing a
  857. X.I %s
  858. Xwhere the relevant information should go.  In the case of
  859. X.BR ReturnValueName ,
  860. Xthe
  861. X.I %s
  862. Xrefers to a function name and the resulting string gives the name of
  863. Xthe variable to use to hold the function's return value.  Such a variable
  864. Xwill be made if a function contains assignments to its return value
  865. Xburied within the body, so that
  866. X.I return
  867. Xstatements cannot conveniently be used.  Some parameters
  868. X.RB ( ReturnValueName
  869. Xincluded) do not require the
  870. X.I %s
  871. Xto be present in the format string; for example, the standard
  872. X.I p2crc
  873. Xfile stores every function's return value in a variable called
  874. X.I Result.
  875. X.TP
  876. X.B AlternateName
  877. X.I P2c
  878. Xnormally translates Pascal names into C names verbatim, but occasionally
  879. Xthis is not possible.  A Pascal name may be a C reserved word or
  880. Xtraditional C name like
  881. X.I putc,
  882. Xor there may be several like-named things that are hidden from each other by
  883. XPascal's scoping rules but must be global in C.  In these situations
  884. X.I p2c
  885. Xuses the parameter
  886. X.B AlternateName1
  887. Xto generate an alternative name for the symbol.  The default is to add
  888. Xan underscore to the name.  There is also an
  889. X.B AlternateName2
  890. Xparameter for a second alternate name, and an
  891. X.B AlternateName
  892. Xparameter for the
  893. X.IR n th
  894. Xalternate name.  (The value for this parameter should include both a
  895. X.I %s
  896. Xand a
  897. X.I %d,
  898. Xin either order.)  If these latter parameters are not defined,
  899. X.I p2c
  900. Xapplies
  901. X.B AlternateName1
  902. Xmany times over.
  903. X.TP
  904. X.B ExportSymbol
  905. XSymbols in the interface section for a Pascal module are formatted
  906. Xaccording to the value of
  907. X.BR ExportSymbol ,
  908. Xif any.  It is not uncommon to use
  909. X.I modulename_%s
  910. Xfor this symbol; the default is
  911. X.I %s,
  912. Xi.e., no special treatment for exported symbols.  If you also define the
  913. X.B Export_Symbol
  914. Xparameter, that format is used instead for exported symbols which
  915. Xcontain an underscore character.  If
  916. X.I %S
  917. X(with a capital "S") appears in the format string it stands for the
  918. Xcurrent module name.
  919. X.TP
  920. X.B Alias
  921. XIf the value of this parameter contains a
  922. X.I %s,
  923. Xit is a format string applied to the names of external functions or
  924. Xvariables.  If the value does not contain a
  925. X.I %s,
  926. Xit becomes the name of the next external symbol which is declared (after
  927. Xwhich the parameter is cleared).
  928. X.TP
  929. X.B Synonym
  930. XThis creates a synonym for another Pascal symbol or keyword.  The format is
  931. X.IP
  932. X.B "\ \ \ \ \ Synonym"
  933. X.I old-name = new-name
  934. X.IP
  935. XAll occurrences of 
  936. X.I old-name
  937. Xin the input text are treated as if they were
  938. X.I new-name
  939. Xby the parser.  If
  940. X.I new-name
  941. Xis a keyword,
  942. X.I old-name
  943. Xwill be an equivalent keyword.  If
  944. X.I new-name
  945. Xis the name of a predefined function,
  946. X.I old-name
  947. Xwill behave in the same way as that function, and so on.  If
  948. X.I new-name
  949. Xis omitted, then occurrences of
  950. X.I old-name
  951. Xare entirely ignored in the input file.  Synonyms allow you to skip over
  952. Xa keyword in your dialect of Pascal that is not understood by
  953. X.I p2c,
  954. Xor to simulate a keyword or predefined identifier of your dialect with a
  955. Xsimilar one that
  956. X.I p2c
  957. Xrecognizes.  Note that all predefined functions are available at all times;
  958. Xif you have a library routine that behaves like, e.g., Turbo Pascal's
  959. X.I getmem
  960. Xprocedure, you can make your routine a synonym for
  961. X.I getmem
  962. Xeven if you are not translating in Turbo mode.
  963. X.TP
  964. X.B NameOf
  965. XThis defines the name to use in C for a specific symbol.  It must appear
  966. Xbefore the symbol is declared in the Pascal code; it is usually placed
  967. Xin the local
  968. X.I p2crc
  969. Xfile for the project.  The format is
  970. X.IP
  971. X.B "\ \ \ \ \ NameOf"
  972. X.I pascal-name = C-name
  973. X.IP
  974. XBy default, Pascal names map directly onto C names with no change
  975. X(except for the various kinds of formatting outlined above).  If the
  976. X.I pascal-name
  977. Xis of the form
  978. X.I module.name
  979. Xor
  980. X.I procedure.name
  981. Xthen the command applies only to the instance of the Pascal name that is
  982. Xglobal to that module, or local to that procedure.  Otherwise, it applies
  983. Xto all usages of the name.
  984. X.TP
  985. X.B VarMacro
  986. XThis is analogous to
  987. X.BR NameOf ,
  988. Xbut specifically for use with Pascal variables.  The righthand side can
  989. Xbe most any C expression; all references to the variable are expanded
  990. Xinto that C expression.  Names used in the C expression are taken
  991. Xverbatim.  There is also a
  992. X.B ConstMacro
  993. Xparameter for translating constants as arbitrary expressions.
  994. XNote that the variable on the lefthand side must actually be declared
  995. Xin the program or in a module that it uses.
  996. XThe declaration for the variable will be omitted from the generated code
  997. Xunless the Pascal-name appears in the expression:  If you ask to
  998. Xreplace
  999. X.I i
  1000. Xwith
  1001. X.I i+1,
  1002. Xthe variable
  1003. X.I i
  1004. Xwill still be declared but its value will be shifted accordingly.
  1005. XNote that if
  1006. X.I i
  1007. Xappears on the lefthand side of an assignment,
  1008. X.I p2c
  1009. Xwill use algebra to "solve" for
  1010. X.I i.
  1011. X.IP
  1012. XIn all cases where
  1013. X.I p2c
  1014. Xparses C expressions, all C operators are recognized except compound
  1015. Xassignments like `+='.  (Increment and decrement operators are allowed.)
  1016. XAll variable and function names are assumed to have integer type, even
  1017. Xif they are names that occur in the actual program.  A type-specification
  1018. Xoperator `::' has been introduced; it has the same precedence as `.' or `->'
  1019. Xbut the righthand side must be a Pascal type identifier (built-in or defined
  1020. Xby your program previously to when the macro definition was parsed),
  1021. Xor an arbitrary Pascal type expression in parentheses.
  1022. XThe lefthand argument is then
  1023. Xconsidered to have the specified type.  This may be necessary if your
  1024. Xmacro is used in situations where the exact type of the expression
  1025. Xmust be known (say, as the argument to a
  1026. X.IR writeln ).
  1027. X.TP
  1028. X.B FieldMacro
  1029. XHere the lefthand side must have the form
  1030. X.I record.field,
  1031. Xwhere
  1032. X.I record
  1033. Xis the Pascal type or variable name for a record, and
  1034. X.I field
  1035. Xis a field in that record.  The righthand side must be a C expression
  1036. Xgenerally including the name
  1037. X.I record.
  1038. XAll instances of that name are replaced by the actual record being "dotted."
  1039. XFor example,
  1040. X.IP
  1041. X\ \ \ \ \ FieldMacro Rect.topLeft = topLeft(Rect)
  1042. X.IP
  1043. Xtranslates
  1044. X.I a[i].topLeft
  1045. Xinto
  1046. X.I topLeft(a[i]),
  1047. Xwhere
  1048. X.I a
  1049. Xis an array of
  1050. X.I Rect.
  1051. X.TP
  1052. X.B FuncMacro
  1053. XThe lefthand side must be any Pascal function or procedure name plus a
  1054. Xparameter list.  The number of parameters must match the number in the
  1055. Xfunction's uses and declaration.  Calls to the function are replaced by the
  1056. XC expression on the righthand side.  For example,
  1057. X.IP
  1058. X\ \ \ \ \ FuncMacro PtInRect(p,r) = PtInRect(p,&r)
  1059. X.IP
  1060. Xcauses the second argument of
  1061. X.I PtInRect
  1062. Xto be passed by reference, even though the declaration says it's not.
  1063. XIf the function in question is actually defined in the program or module
  1064. Xbeing translated, the
  1065. X.B FuncMacro
  1066. Xwill not affect the definition but it will affect all calls to the function
  1067. Xelsewhere in the module.
  1068. X.B FuncMacros
  1069. Xcan also be applied to predefined or never-defined functions.
  1070. X.TP
  1071. X.B IncludeFrom
  1072. XThis specifies that a given module's header should be included from a
  1073. Xgiven place.  The second argument may be surrounded by "\ " or <\ > as
  1074. Xnecessary; if the second argument is omitted, no include directive will
  1075. Xbe generated for the module.
  1076. X.TP
  1077. X.B ImportFrom
  1078. XThis specifies that a given module's Pascal interface text can be found
  1079. Xin the given file.  The named file should be either the source file for
  1080. Xthe module, or a specially prepared file with the implementation section
  1081. Xremoved for speed.  If no
  1082. X.B ImportFrom
  1083. Xentry is found for a module, the path defined by the
  1084. X.B ImportDir
  1085. Xlist is searched.  Each entry in the path may contain a
  1086. X.I %s,
  1087. Xwhich expands to the name of the module.  The default path looks for
  1088. X.I %s.pas
  1089. Xand
  1090. X.I %s.text
  1091. Xin the current directory, then for
  1092. X.I --HOMEDIR--/%s.imp.
  1093. X(where --HOMEDIR-- is the
  1094. X.I p2c
  1095. Xhome directory.)
  1096. X.TP
  1097. X.B StructFunction
  1098. XThis parameter is a list of functions which follow the
  1099. X.I p2c
  1100. Xsemantics for structure-valued functions (functions returning arrays,
  1101. Xsets, and strings, and structs in primitive C dialects).  For these
  1102. Xfunctions, a pointer to a return-value area is passed to the function
  1103. Xas a special first parameter.  The function stores the result in this
  1104. Xarea, then returns a copy of the pointer.  (The standard C function
  1105. X.I strcpy
  1106. Xis an example of this concept.
  1107. X.I Sprintf
  1108. Xalso behaves this way in some dialects; it always appears on the
  1109. X.B StructFunction
  1110. Xlist regardless of the type of implementation.)  The system configuration
  1111. Xfile includes a list of common structured functions so that
  1112. X.IR p2c 's
  1113. Xoptimizer will know how to manipulate them.
  1114. X.TP
  1115. X.B StrlapFunction
  1116. XFunctions on this list are structured functions as above, but with the
  1117. Xability to work in-place; that is, the same pointer may be passed as both the
  1118. Xreturn value area and a regular parameter.
  1119. X.TP
  1120. X.B Deterministic
  1121. XFunctions on this list have no side effects or side dependencies.
  1122. XAn example is the
  1123. X.I sin
  1124. Xfunction in the standard math library; two calls with the same parameter
  1125. Xvalues produce the same result, and have no effects other than returning
  1126. Xa value.
  1127. X.I P2c
  1128. Xcan make use of this knowledge when optimizing code for efficiency or
  1129. Xreadability.  Functions on this list are also assumed to be relatively
  1130. Xfast, so that it is acceptable to duplicate a call to the function.
  1131. X.TP
  1132. X.B LeaveAlone
  1133. XFunctions on this list are not subjected to the normal built-in translation
  1134. Xrules that
  1135. X.I p2c
  1136. Xwould otherwise use.  For example, adding
  1137. X.I writeln
  1138. Xto this list would translate
  1139. X.I writeln
  1140. Xstatements blindly into calls to a C
  1141. X.I writeln()
  1142. Xfunction, rather than being translated into equivalent
  1143. X.I printf
  1144. Xcalls.  The built-in translation is also suppressed if the function has a
  1145. X.BR FuncMacro .
  1146. X.TP
  1147. X.B BufferedFile
  1148. X.I P2c
  1149. Xnormally assumes binary files will use
  1150. X.I read/write,
  1151. Xnot
  1152. X.I get/put/^
  1153. Xnotation.
  1154. XA file buffer variable will only be created for a file if buffer notation
  1155. Xis used for it.  For global file variables this may be detected too late
  1156. X(a declaration without buffers may already have been written).  Such files
  1157. Xcan be listed in
  1158. X.B BufferedFile
  1159. Xto force
  1160. X.I p2c
  1161. Xto allocate buffers for them; do this if you get a warning
  1162. Xmessage that says it is necessary.  Set
  1163. X.BR BufferedFile =1
  1164. Xto buffer all files, in which case
  1165. X.B UnBufferedFile
  1166. Xallows you to force certain files
  1167. X.I not
  1168. Xto have buffers.
  1169. X.TP
  1170. X.B CheckFileEOF
  1171. XNormally only file-open operations are checked for errors.  Additional
  1172. Xerror checking, such as read-past-end-of-file, can be enabled with
  1173. Xparameters like
  1174. X.BR CheckFileEOF .
  1175. XThese checks can make the code very ugly!  If I/O checking is enabled
  1176. Xby the program
  1177. X.RB ( "$iocheck on$"
  1178. Xin HP Pascal;
  1179. X.B {$I+}
  1180. Xin Turbo; this is always the default state),
  1181. Xthese checks will generate fatal errors unless enclosed in an HP Pascal
  1182. X.BR try - recover
  1183. Xconstruct.  If I/O checking is disabled, these will cause the global
  1184. Xvariable
  1185. X.I P_ioresult
  1186. Xto be set zero or nonzero according to the outcome.  The default for most
  1187. Xof these options is to check only when I/O checking is disabled.
  1188. X.SH ISSUES
  1189. X.B Integer size.
  1190. X.I P2c
  1191. Xnormally generates code to work with either 16 or 32 bit ints.
  1192. XIf you know your C integers will be 16 or 32 bits, set
  1193. X.B IntSize
  1194. Xappropriately.  In particular setting
  1195. X.BR IntSize =32
  1196. Xwill generate much cleaner code:
  1197. X.I p2c
  1198. Xno longer must carefully cast function arguments between int and long.
  1199. XThese casts also will be unnecessary if ANSI prototypes are available.
  1200. XTo disable int/long casting because you know at least one of these
  1201. Xcases will hold, set
  1202. X.BR CastLongArgs =0.
  1203. X(The
  1204. X.B CastArgs
  1205. Xparameter similarly controls other types of casts, such as between ints
  1206. Xand doubles.)
  1207. XThe
  1208. X.B Integer16
  1209. Xparameter controls whether Pascal integers are interpreted as 16 or 32
  1210. Xbits, or translated as native C integers.  The default value depends on the
  1211. X.B Language
  1212. Xselected.
  1213. X.PP
  1214. X.B Signed/unsigned chars.
  1215. XPascal characters are normally "weakly" interpreted as unsigned; this
  1216. Xis controlled by
  1217. X.BR UnsignedChar .
  1218. XThe default is "either," so that C's native
  1219. X.B char
  1220. Xtype may be used even if its signed-ness is unknown.  Code that uses
  1221. Xcharacters outside of the range 0-127 may need a different setting.
  1222. XAlternatively, you can use the types
  1223. X.B {SIGNED} char
  1224. Xand
  1225. X.B {UNSIGNED} char
  1226. Xin the few cases where it really matters.  These comments are controlled
  1227. Xby the
  1228. X.B SignedComment
  1229. Xand
  1230. X.B UnsignedComment
  1231. Xparameters.  (The type
  1232. X.B {UNSIGNED} integer
  1233. Xis also recognized.)  The
  1234. X.B SignedChar
  1235. Xparameter tells whether C characters are signed or unsigned (default is
  1236. X"unknown").  The
  1237. X.B HasSignedChar
  1238. Xparameter tells whether the phrase "signed char" is legal in the output.
  1239. XIf it is not,
  1240. X.I p2c
  1241. Xmay have to translate Pascal signed bytes into C shorts.
  1242. X.PP
  1243. X.B Special types.
  1244. X.I P2c
  1245. Xunderstands the following predefined Pascal type names:
  1246. X.BR integer ,
  1247. Xsigned integers depending on
  1248. X.BR Integer16 ;
  1249. X.BR longint ,
  1250. Xsigned 32-bit integers;
  1251. X.BR unsigned ,
  1252. Xunsigned 32-bit integers;
  1253. X.BR sword ,
  1254. Xsigned 16-bit integers;
  1255. X.BR word ,
  1256. Xunsigned 16-bit integers;
  1257. X.BR c_int ,
  1258. Xsigned native C integers;
  1259. X.BR c_uint ,
  1260. Xunsigned native C integers;
  1261. X.BR sbyte ,
  1262. Xsigned 8-bit integers;
  1263. X.BR byte ,
  1264. Xunsigned 8-bit integers;
  1265. X.BR real ,
  1266. Xfloating-point numbers depending on
  1267. X.BR DoubleReals ;
  1268. X.BR single ,
  1269. Xsingle-precision floats;
  1270. X.BR longreal ,
  1271. X.BR double ,
  1272. Xand
  1273. X.BR extended ,
  1274. Xdouble-precision floats;
  1275. X.B pointer
  1276. Xand
  1277. X.BR anyptr ,
  1278. Xgeneric pointers (assignment-compatible with any pointer type);
  1279. X.BR string ,
  1280. Xgeneric string of length
  1281. X.B StringDefault
  1282. X(normally 255);
  1283. Xalso, the usual Pascal types
  1284. X.BR char ,
  1285. X.BR boolean ,
  1286. Xand
  1287. X.BR text .
  1288. X(If your Pascal uses different names for these concepts, the
  1289. X.B Synonym
  1290. Xoption will come in handy.)
  1291. X.PP
  1292. X.B Embedded code.
  1293. XIt is possible to write a Pascal comment containing C code to
  1294. Xbe embedded into the output.  See the descriptions of
  1295. X.B EmbedComment
  1296. Xand its relatives in the system
  1297. X.I p2crc
  1298. Xfile.  These techniques are helpful if you plan to do repeated translations
  1299. Xof code that is still being maintained in Pascal.
  1300. X.PP
  1301. X.B Comments and blank lines.
  1302. X.I P2c
  1303. Xcollects the comments in a procedure into a list.  All comments and statements
  1304. Xare stamped with serial numbers which are used to reattach comments to
  1305. Xstatements even after code has been added, removed, or rearranged during
  1306. Xtranslation.  "Orphan" comments attached to statements that have been lost
  1307. Xare attached to nearby statements or emitted at the end of the procedure.
  1308. XBlank lines are treated as a kind of comment, so
  1309. X.I p2c
  1310. Xwill also reproduce your usage of blank lines.  If the comment mechanism
  1311. Xgoes awry, you can disable comments with
  1312. X.B EatComments
  1313. Xor disable their being attached to code with
  1314. X.BR SpitComments .
  1315. X.PP
  1316. X.B Indentation.
  1317. X.I P2c
  1318. Xhas a number of parameters to govern indentation of code.  The default
  1319. Xvalues produce the GNU Emacs standard indentation style, although
  1320. X.I p2c
  1321. Xcan do a better job since it knows more about the code it is indenting.
  1322. XIndentation works by applying "indentation deltas," which are either
  1323. Xabsolute numbers (which override the previous indentation), or signed
  1324. Xrelative numbers (which augment the previous indentation).  A delta of
  1325. X"+0" specifies no change in indentation.  All of the indentation
  1326. Xoptions are described in the standard
  1327. X.I p2crc
  1328. Xfile.
  1329. X.PP
  1330. X.B Line breaking.
  1331. X.I P2c
  1332. Xuses an algorithm similar to the TeX typesetter's paragraph formatter
  1333. Xfor breaking long statements into multiple lines.  A "penalty" is assigned
  1334. Xto various undesirable aspects of all possible line breaks; the "badness"
  1335. Xof a set of line breaks is approximately the sum of all the penalties.
  1336. XChief among these are serious penalties for overrunning the desired maximum
  1337. Xline length (default 78 columns),
  1338. Xan infinite penalty for overrunning the absolute
  1339. Xmaximum line length (default 90), and progressively greater penalties for
  1340. Xbreaking at operators deeply nested in expressions.  Parameters such as
  1341. X.B OpBreakPenalty
  1342. Xcontrol the relative weights of various choices.
  1343. X.B BreakArith
  1344. Xand its neighbors control whether the operator at a line break should be
  1345. Xplaced at the end of the previous line or at the beginning of the next.
  1346. XIf you don't want any oversize lines, define
  1347. X.BR MaxLineWidth =78.
  1348. X.PP
  1349. XUnlike TeX,
  1350. X.IR p2c 's
  1351. Xline breaker must actually try all possible sets of break points.  To
  1352. Xavoid excessive computation, the total penalty contributed at each decision
  1353. Xpoint must sum to a nonnegative value; negative values are clipped up to zero.
  1354. XThis allows
  1355. X.I p2c
  1356. Xto prune away obviously undesirable alternatives in advance.  The
  1357. X.B MaxLineBreakTries
  1358. Xparameter (default 5000) controls how many alternatives to try before
  1359. Xgiving up and using the best so far.
  1360. X.PP
  1361. X.B PASCAL_MAIN.
  1362. X.I P2c
  1363. Xgenerates a call to this function at the front of the main program.
  1364. XIn the (unmodified) run-time library all this does is save argc and argv
  1365. Xaway because in both HP and Turbo these are accessed as global variables.
  1366. XIf you do not wish to use this feature, define
  1367. X.B ArgCName
  1368. Xto be
  1369. X.I argc,
  1370. X.B ArgVName
  1371. Xto be
  1372. X.I argv,
  1373. Xand
  1374. X.B MainName
  1375. X(normally "PASCAL_MAIN") to be blank.  This will work if argc and argv
  1376. Xare never accessed outside of your main program.
  1377. X.SH BUGS
  1378. X.I P2c
  1379. Xwas designed with the idea that clean, readable output in most cases is
  1380. Xworth more than guaranteed correct output in extreme cases.
  1381. X.I P2c
  1382. Xis
  1383. X.I not
  1384. Xa compiler!  However, ideally the "extreme" cases would include only those
  1385. Xwhich never arise in real life.  Thus if
  1386. X.I p2c
  1387. Xactually generates incorrect code I will consider it a bug, but I will not
  1388. Xapologize for it. :-)  Below are the major remaining cases where this is
  1389. Xknown to occur.
  1390. X.PP
  1391. XCertain kinds of conformant array parameters (including multi-dimensional
  1392. Xconformant arrays) produce code that declares variable-length arrays in C.
  1393. XOnly a few C compilers, such as the GNU C compiler, support this language
  1394. Xextension.  Otherwise some hand re-coding will be required.
  1395. X.PP
  1396. XHP Pascal
  1397. X.BR try - recover
  1398. Xstructures are translated into calls to
  1399. X.I TRY
  1400. Xand
  1401. X.I RECOVER
  1402. Xmacros, which are defined to simulate the construct using
  1403. X.I setjmp
  1404. Xand
  1405. X.I longjmp.
  1406. XIf this emulation does not work, define the symbol
  1407. X.B FAKE_TRY
  1408. Xto cause these macros to become "inert."  (In cases where the
  1409. Xerror is detected by code physically within the body of the
  1410. X.B try
  1411. Xstatement, a C
  1412. X.B goto
  1413. Xto the
  1414. X.B recover
  1415. Xsection is always generated.)  Also, local file variables in scopes which
  1416. Xare destroyed by an
  1417. X.B escape
  1418. Xare not closed.
  1419. X.PP
  1420. XNon-local GOTO's and
  1421. X.BR try - recover
  1422. Xstatements are each implemented, but may
  1423. Xconflict if both are used at once.  Non-local GOTO's are fairly careful
  1424. Xabout closing files that go out of scope but may fail to do so in the presence
  1425. Xof recursion.
  1426. X.PP
  1427. XArrays containing files are not initialized to NULL as other files are.
  1428. XIn some cases, such as file variables allocated by NEW, the file is
  1429. Xinitialized but not automatically closed by DISPOSE.
  1430. X.PP
  1431. XLINK variables allowing sub-procedures access to their parents' variables
  1432. Xare occasionally omitted by mistake, if the access is too indirect for
  1433. X.I p2c
  1434. Xto notice.  If this happens, you can add an explicit reference to a parent
  1435. Xvariable in the sub-procedure.  A statement of the form "a:=a" will count
  1436. Xas a reference but then be optimized away by
  1437. X.I p2c.
  1438. X.PP
  1439. XMany aspects of Modula-2 are translated only superficially.  For example,
  1440. Xthe type-compatibility properties of the
  1441. X.I WORD
  1442. Xand
  1443. X.I ARRAY OF WORD
  1444. Xtypes are only roughly modelled, as are the scope rules concerning modules.
  1445. X.PP
  1446. XParts of VAX Pascal are still untreated.  In particular, the
  1447. X.I [UNSAFE]
  1448. Xattribute and a few others are not fully supported,
  1449. Xnor are the semantics of the
  1450. X.I OPEN
  1451. Xprocedure.
  1452. X.PP
  1453. XTurbo and VAX Pascal's
  1454. X.I double, quadruple,
  1455. Xand
  1456. X.I extended
  1457. Xreal types all translate to the C
  1458. X.B double
  1459. Xtype.  Turbo's
  1460. X.I computational
  1461. Xtype is not supported at all.
  1462. X.PP
  1463. XBecause Pascal strings (with length bytes) are translated into C strings
  1464. X(with null terminators), certain Pascal string tricks will not work in
  1465. Xthe translated code.  For example the assignment
  1466. X.I s[0]:=chr(x)
  1467. Xis translated to
  1468. X.I s[x]=0
  1469. Xon the assumption that the string is being shortened.  If
  1470. X.I x
  1471. Xis actually greater than the current length, but not of a recognizable
  1472. Xform like
  1473. X.I ord(s[0])+n,
  1474. Xthen the generated code will not work.  In VAX Pascal this corresponds
  1475. Xto performing arithmetic on the
  1476. X.I LENGTH
  1477. Xfield of a varying-length string.
  1478. X.PP
  1479. XTurbo Pascal's automatic clipping of strings is not supported.  In
  1480. XTurbo, if a ten character string is assigned to a
  1481. X.I string[8]
  1482. Xvariable, the last two characters are silently removed.  The code
  1483. Xproduced by
  1484. X.I p2c
  1485. Xgenerally will overrun the target string instead!  The
  1486. X.B StringTruncLimit
  1487. Xparameter (80 by default if
  1488. X.BR Language = Turbo )
  1489. Xspecifies a string size which should be considered "short"; assignments
  1490. Xof potentially-long strings to short string variables will cause a warning
  1491. Xbut will not automatically truncate.  The cure is to use
  1492. X.I copy
  1493. Xin the Pascal source to truncate the strings explicitly.
  1494. X.SH FILES
  1495. X.ta \w'--INCDIR--/p2c.h 'u
  1496. Xfile.\fIxxx\fR    Pascal source files
  1497. X.br
  1498. Xfile.c    resulting C source file
  1499. X.br
  1500. Xmodule.h    resulting C header file
  1501. X.br
  1502. Xp2crc    local configuration file
  1503. X.br
  1504. X\&.p2crc    alternate local configuration file
  1505. X.br
  1506. X--HOMEDIR--/p2crc    system-wide configuration file
  1507. X.br
  1508. X--HOMEDIR--/system.imp    declarations for predefined functions
  1509. X.br
  1510. X--HOMEDIR--/system.m2    analogous declarations for Modula-2
  1511. X.br
  1512. X--HOMEDIR--/*.imp    interface text for standard modules
  1513. X.br
  1514. X--INCDIR--/p2c.h    header file for translated programs
  1515. X.br
  1516. X--LIBDIR--/libp2c.a    run-time library
  1517. X.SH AUTHOR
  1518. XDave Gillespie, daveg@csvax.caltech.edu.
  1519. X.PP
  1520. XMany thanks to William Bader, Rick Koshi, Eric Raymond, Magne Haveraaen,
  1521. XDirk Grunwald, David Barto, Paul Fisher, and others whose suggestions and
  1522. Xbug reports have helped improve
  1523. X.I p2c
  1524. Xin countless ways.
  1525. END_OF_FILE
  1526. if test 46517 -ne `wc -c <'src/p2c.man'`; then
  1527.     echo shar: \"'src/p2c.man'\" unpacked with wrong size!
  1528. fi
  1529. # end of 'src/p2c.man'
  1530. fi
  1531. echo shar: End of archive 18 \(of 32\).
  1532. cp /dev/null ark18isdone
  1533. MISSING=""
  1534. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ; do
  1535.     if test ! -f ark${I}isdone ; then
  1536.     MISSING="${MISSING} ${I}"
  1537.     fi
  1538. done
  1539. if test "${MISSING}" = "" ; then
  1540.     echo You have unpacked all 32 archives.
  1541.     echo "Now see PACKNOTES and the README"
  1542.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1543. else
  1544.     echo You still need to unpack the following archives:
  1545.     echo "        " ${MISSING}
  1546. fi
  1547. ##  End of shell archive.
  1548. exit 0
  1549.