home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume21 / p2c / part11 < prev    next >
Text File  |  1990-04-05  |  36KB  |  813 lines

  1. Subject:  v21i056:  Pascal to C translator, Part11/32
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: e506fa19 400f9003 1e369812 30e18e13
  5.  
  6. Submitted-by: Dave Gillespie <daveg@csvax.caltech.edu>
  7. Posting-number: Volume 21, Issue 56
  8. Archive-name: p2c/part11
  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 11 (of 32)."
  17. # Contents:  src/NOTES
  18. # Wrapped by rsalz@litchi.bbn.com on Mon Mar 26 14:29:35 1990
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'src/NOTES' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'src/NOTES'\"
  22. else
  23. echo shar: Extracting \"'src/NOTES'\" \(33044 characters\)
  24. sed "s/^X//" >'src/NOTES' <<'END_OF_FILE'
  25. X
  26. XTHE GRAND P2C NOTES FILE:
  27. X
  28. XThis file contains notes to myself recording bugs, flaws, and suggested
  29. Ximprovements to p2c.  They have roughly been separated into "old", "older",
  30. Xand "oldest" groups.  I can't guarantee I'll do any of these.  If you do,
  31. Xplease mail me the diffs so I can incorporate them into the next release.
  32. XThanks!
  33. X                        -- Dave Gillespie
  34. X                           daveg@csvax.caltech.edu
  35. X
  36. X-----------------------------------------------------------------------------
  37. X
  38. X   The Pascal declaration
  39. X
  40. X      type foo = set of (one, two);
  41. X
  42. X   does not ever write out an "enum { one, two }" declaration in C!
  43. X
  44. X-----------------------------------------------------------------------------
  45. X
  46. X   Handling of comments that trail the ELSE clause of an IF statement
  47. X   could use some work.
  48. X
  49. X-----------------------------------------------------------------------------
  50. X
  51. X   Technically speaking, "for byte := min to max do" is legal even
  52. X   if min > 255, i.e., the limits only need to be in range if the
  53. X   body of the loop executes.  Thus, FOR loops should really use a
  54. X   shadow parameter not just when max is the constant 255, but
  55. X   whenever min or max are not provably in byte range.
  56. X
  57. X-----------------------------------------------------------------------------
  58. X
  59. X   Have a "-M"-like mode in which FREE is suppressed altogether, useful
  60. X   in case p2c crashes because bugs have corrupted malloc's free list.
  61. X
  62. X-----------------------------------------------------------------------------
  63. X
  64. X   For expressions building small-sets whose maximum element is <= 15,
  65. X   use "1 << x" instead of "1L << x".
  66. X
  67. X-----------------------------------------------------------------------------
  68. X
  69. X   Handle VAX Pascal VARYING OF CHARs used as the arguments of WITH
  70. X   statements.
  71. X
  72. X-----------------------------------------------------------------------------
  73. X
  74. X   Have a p2crc feature which identifies a given named constant as
  75. X   being a character, not a string of length 1.  Have an option in
  76. X   which this is the default interpretation.
  77. X
  78. X-----------------------------------------------------------------------------
  79. X
  80. X   StringTruncLimit would be helped by expr.c:strmax() interpreting
  81. X   sprintf control strings.  For %s, use strmax of the corresponding
  82. X   argument.  For %d, use 11, etc.  For %.10s, use min(10, strmax(arg)).
  83. X   For %.*s, just use strmax(arg), I guess.
  84. X
  85. X   Have a mode in which such assignments are automatically truncated.
  86. X
  87. X   Perform truncation testing for non-VAR procedure arguments, too.
  88. X
  89. X-----------------------------------------------------------------------------
  90. X
  91. X   In cref.p, the "strappend(buf,#0)" statement translates into
  92. X   "strcpy(STR1,buf); strcpy(buf,STR1)" with a warning about a null
  93. X   character in a sprintf control string!
  94. X
  95. X-----------------------------------------------------------------------------
  96. X
  97. X   Still having problems where the opening comment of an imported
  98. X   module's interface text is copied into the program.
  99. X
  100. X-----------------------------------------------------------------------------
  101. X
  102. X   VAX Pascal features not yet handled:
  103. X
  104. X      [UNSAFE] attribute is only implemented in a few situations.
  105. X      [UNBOUND] attribute on a procedure says it doesn't need a static link.
  106. X      [TRUNCATE] attribute on a parameter allows optional params w/no default.
  107. X      [LIST] attribute on a parameter is like &rest in Lisp.
  108. X      Support types like, e.g., [LONG] BOOLEAN.
  109. X      Can assign "structurally compatible" but different record types.
  110. X      File intrinsics need serious work, especially OPEN.
  111. X      If a copy param is [READONLY], don't need to copy it.
  112. X      If a procedure is [ASYNCHRONOUS], make all its variables volatile.
  113. X      If a procedure is [NOOPTIMIZE], make all its variables volatile.
  114. X      Provide a real implementation of BIN function and :BIN read format.
  115. X      BIT_OFFSET and CARD intrinsics are not supported.
  116. X
  117. X-----------------------------------------------------------------------------
  118. X
  119. X   Modula-2 features not yet handled:
  120. X
  121. X      Local modules are faked up in a pretty superficial way.
  122. X      WORD is compatible with both pointers and CARDINALs.
  123. X      WORD parameters are compatible with any word-sized object.
  124. X      ARRAY OF WORD parameters are compatible with absolutely anything.
  125. X      Improve treatment of character strings.
  126. X      Find manuals for real implementations of Modula-2 and implement
  127. X         any common language extensions.
  128. X      Fix p2c to read system.m2 instead of system.imp automatically.
  129. X
  130. X-----------------------------------------------------------------------------
  131. X
  132. X   Oregon Software Pascal features not yet handled:
  133. X
  134. X    procedure noioerror(var f:file);
  135. X        Built-in.  Sets a flag on an already-open file so that
  136. X        I/O errors record an error code rather than crashing.
  137. X        Each file has its own error code.
  138. X
  139. X    function ioerror(var f:file) : boolean;
  140. X        True if an error has occurred in the file.
  141. X
  142. X    function iostatus(var f:file) : integer;
  143. X        The error code, when ioerror was true.
  144. X
  145. X    reset and rewrite ignore the third parameter, and allow a fourth
  146. X    param which is an integer variable that receives a status code.
  147. X    Without this param, open errors are fatal.  An optional param
  148. X    may be omitted as in reset(f,'foo',,v);
  149. X
  150. X-----------------------------------------------------------------------------
  151. X
  152. X   In p_search, if a file contains const/var/type/procedure/function
  153. X   declarations without any module declaration, surround the entire
  154. X   file with an implicit "module <generated-name>; {PERMANENT}" ... "end.".
  155. X   This would help the Oregon Software dialect considerably.
  156. X
  157. X-----------------------------------------------------------------------------
  158. X
  159. X   Provide an explicit IncludeFrom syntax for "no include file".
  160. X   E.g., "IncludeFrom dos 0".
  161. X
  162. X-----------------------------------------------------------------------------
  163. X
  164. X   In docast, smallsets are converted to large sets of the requested type.
  165. X   Wouldn't it be better to convert to a set of 0..31 of the base type?
  166. X   This would keep foo([]), where the argument is "set of char", from
  167. X   allocating a full 256-bit array for the temporary.
  168. X
  169. X-----------------------------------------------------------------------------
  170. X
  171. X   When initializing a constant variant record or array of same in which
  172. X   non-first variants are initialized, create a function to do the
  173. X   initialization, plus, for modules w/o initializers, a note to call
  174. X   this function.  Another possibility:  Initialize the array as well as
  175. X   possible, but leave zeros in the variant parts.  Then the function
  176. X   has only to fix up the non-first variant fields.
  177. X
  178. X-----------------------------------------------------------------------------
  179. X
  180. X   Figure out some way to initialize packed array constants, e.g., a short
  181. X   macro PACK4(x,y)=(((x)<<4)+(y)) which is used inside the C initializer.
  182. X   Alternatively, implement initializer functions as above and use those.
  183. X
  184. X-----------------------------------------------------------------------------
  185. X
  186. X   How about declaring Volatile any variables local to a function which
  187. X   are used after the first RECOVER?  GNU also suggests writing the
  188. X   statement:  "&foo;" which will have no side effect except to make
  189. X   foo essentially volatile, without relying on ANSI features.
  190. X
  191. X-----------------------------------------------------------------------------
  192. X
  193. X   Test the macros for GET, PUT, etc.
  194. X
  195. X-----------------------------------------------------------------------------
  196. X
  197. X   Can the #if 0'd code for strinsert in funcs.c be changed to test
  198. X   strcpyleft?
  199. X
  200. X-----------------------------------------------------------------------------
  201. X
  202. X   Even in Ansi mode, p2c seems to be casting Anyptrs into other pointer
  203. X   types explicitly.  This is an automatic conversion in Ansi C.
  204. X
  205. X-----------------------------------------------------------------------------
  206. X
  207. X   A Turbo typed constant or VAX initialized variable with a VarMacro
  208. X   loses its initializer!
  209. X
  210. X-----------------------------------------------------------------------------
  211. X
  212. X   Test the ability of the parser to recover from common problems such
  213. X   as too many/few arguments to a procedure, missing/extra semicolon, etc.
  214. X   One major problem has been with undeclared identifiers being used as
  215. X   type names.
  216. X
  217. X-----------------------------------------------------------------------------
  218. X
  219. X   Line breaker still needs considerable tuning!
  220. X
  221. X-----------------------------------------------------------------------------
  222. X
  223. X   How about indenting trailing comments analogously to the code:
  224. X   Try to indent to column C+(X-Y), where C=original column number,
  225. X   X=output indentation, Y=original input indentation.
  226. X
  227. X   Even fancier would be to study all the comment indentations in the
  228. X   function or struct decl to discover if most comments are at the same
  229. X   absolute indentation; if so, compute the average or minimum amount of
  230. X   space preceding the comments and indent the C comments to an analogous
  231. X   position.
  232. X
  233. X-----------------------------------------------------------------------------
  234. X
  235. X   After "type foo = bar;" variables declared as type foo are translated
  236. X   as type bar.  Ought to assume the user has two names for a reason,
  237. X   and copy the distinction into the C code.
  238. X
  239. X-----------------------------------------------------------------------------
  240. X
  241. X   Warn if address is taken of an arithmetic expression like "v1+1".
  242. X   Allow user to declare certain bicalls as l-values, e.g., so that
  243. X   LSC's topLeft and botRight macros won't generate complaints.
  244. X
  245. X-----------------------------------------------------------------------------
  246. X
  247. X   Consider changing the "language" modes into a set of p2crc files
  248. X   which can be included to support the various modes.
  249. X
  250. X-----------------------------------------------------------------------------
  251. X
  252. X   If we exchange the THEN and ELSE parts of an IF statement, be sure
  253. X   to exchange their comments as well!
  254. X
  255. X-----------------------------------------------------------------------------
  256. X
  257. X   How about checking for a ".p2crc" file in the user's home directory.
  258. X
  259. X-----------------------------------------------------------------------------
  260. X
  261. X   Store comments in the following situations:
  262. X      On the first line of a record decl.
  263. X      On the default clause of a CASE statement
  264. X        (use same trick as for ELSE clauses).
  265. X      On the "end" of a CASE statement.
  266. X      On null statements.
  267. X      Use stealcomments for, e.g., decl_comments and others.
  268. X
  269. X-----------------------------------------------------------------------------
  270. X
  271. X   Think of other formatting options for format_gen to support.
  272. X
  273. X-----------------------------------------------------------------------------
  274. X
  275. X   Consider converting gratuitous BEGIN/END pairs into gratuitous
  276. X   { } pairs.
  277. X
  278. X-----------------------------------------------------------------------------
  279. X
  280. X   The construction "s := copy(s, 1, 3)" converts to a big mess that
  281. X   could be simplified to "s[3] = 0".
  282. X
  283. X-----------------------------------------------------------------------------
  284. X
  285. X   Have a mode (and make it the default!) in which declarations are mixed
  286. X   if and only if the original Pascal decls were mixed.  Simply store
  287. X   a flag in each meaning to mark "mixed-with-preceding-meaning".
  288. X
  289. X-----------------------------------------------------------------------------
  290. X
  291. X   Have a column number at which to put names in variable and typedef
  292. X   declarations.  Have another option to choose whether a '*' preceding
  293. X   a name should be left- or right-justified within the skipped space:
  294. X    int     *foo;     or
  295. X        int *    foo;
  296. X
  297. X-----------------------------------------------------------------------------
  298. X
  299. X   Support the /*
  300. X                *
  301. X                */ form for multi-line comments.
  302. X
  303. X-----------------------------------------------------------------------------
  304. X
  305. X   Have an indentation parameter for the word "else" by itself on a line.
  306. X
  307. X-----------------------------------------------------------------------------
  308. X
  309. X   Have an option to use C++'s "//" comments when possible.
  310. X   (0=never, 1=always, def=only for trailing comments.)
  311. X
  312. X-----------------------------------------------------------------------------
  313. X
  314. X   Allow real comments to come before top-of-file comments like {Language}.
  315. X
  316. X-----------------------------------------------------------------------------
  317. X
  318. X   Teach the line breaker to remove spaces around innermost operators
  319. X   if in a crunch.
  320. X
  321. X-----------------------------------------------------------------------------
  322. X
  323. X   Is it possible that the line breaker is losing counts?  A line that
  324. X   included lots of invisible parens converted to visible ones was
  325. X   allowed to be suspiciously long.
  326. X
  327. X-----------------------------------------------------------------------------
  328. X
  329. X   The notation t^ where t is a text file should convert \n's to
  330. X   spaces if necessary.
  331. X
  332. X-----------------------------------------------------------------------------
  333. X
  334. X   The assignment and type cast "f4 := tf4(i)" where type
  335. X      "tf4 = function (i, j : integer) : str255"
  336. X   generates something really weird.
  337. X
  338. X-----------------------------------------------------------------------------
  339. X
  340. X   The conditional expression  strsub(s,1,4) = 'Spam'
  341. X   could be translated as      strncmp(s, "Spam", 4)
  342. X
  343. X-----------------------------------------------------------------------------
  344. X
  345. X   Consider an option which generates a "file.p2c" or "module.p2c"
  346. X   file, that will in the future be read in by p2c as another p2crc
  347. X   type of file, both when the module is re-translated later and when
  348. X   it is imported.  This file would contain commands like "NoSideEffects"
  349. X   for functions which are found to have this property, etc.
  350. X
  351. X-----------------------------------------------------------------------------
  352. X
  353. X   Extend the "file.log" or "module.log" file to contain a more detailed
  354. X   account of the translation, including all notes and warnings which were
  355. X   even considered.  For example, ALL calls to na_lsl with non-constant
  356. X   shifts would be noted, even if regular notes in this case were not
  357. X   requested.  Also, funny transformations along the lines of
  358. X   "str[0] := chr(len)" and "ch >= #128" should be mentioned in the log.
  359. X   How about a summary of non-default p2crc options and command-line args?
  360. X
  361. X-----------------------------------------------------------------------------
  362. X
  363. X   Create a TypeMacro analogous to FuncMacro, VarMacro, and ConstMacro.
  364. X   Should the definition be expressed in C or Pascal notation?  (Yuck---not
  365. X   a C type parser!)
  366. X
  367. X-----------------------------------------------------------------------------
  368. X
  369. X   In argument type promotions, should "unsigned char" be promoted to
  370. X   "unsigned int"?
  371. X
  372. X-----------------------------------------------------------------------------
  373. X
  374. X   Turbo's FExpand translation is really weird.
  375. X
  376. X-----------------------------------------------------------------------------
  377. X
  378. X   Can we translate Erase(x) to unlink(x)?  (This could just be a FuncMacro.)
  379. X
  380. X-----------------------------------------------------------------------------
  381. X
  382. X   There should be an option that causes a type to be explicitly named,
  383. X   even if it would not otherwise have had a typedef name.  Have a mode
  384. X   that does this for all pointer types.
  385. X
  386. X-----------------------------------------------------------------------------
  387. X
  388. X   Make sure that the construction:  if blah then {comment} else other
  389. X   does not rewrite to if (!blah) other; i.e., a comment in this situation
  390. X   should generate an actual placeholder statement.  Or perhaps, a null
  391. X   statement written explicitly by the Pascal programmer should always
  392. X   produce a placeholder.
  393. X
  394. X-----------------------------------------------------------------------------
  395. X
  396. X   Allow the line breaker to treat a \003 as if it were a \010.  The penalty
  397. X   should be enough less than SameIndentPenalty that same-indent cases will
  398. X   cause the introduction of parentheses.
  399. X
  400. X-----------------------------------------------------------------------------
  401. X
  402. X   A comment of the form "{------}" where the whole comment is 78, 79 or 80
  403. X   columns wide, should be reduced by two to take the larger C comment
  404. X   brackets into account.  Also, "{*****}", etc.
  405. X
  406. X-----------------------------------------------------------------------------
  407. X
  408. X   There should be a mode that translates "halt" as "exit(0)", and another
  409. X   that translates it as "exit(1)".
  410. X
  411. X-----------------------------------------------------------------------------
  412. X
  413. X   There should be a mode in which strread's "j" parameter is completely
  414. X   ignored.  Also, in this mode, don't make a copy of the string being
  415. X   read.
  416. X
  417. X-----------------------------------------------------------------------------
  418. X
  419. X   Is there an option that generates an fflush(stdout) after every write
  420. X   (not writeln) statement?  It should be easy to do---the code is already
  421. X   there to support the prompt statement.
  422. X
  423. X-----------------------------------------------------------------------------
  424. X
  425. X   Check out the Size_T_Long option; size_t appears to be int on most
  426. X   machines, not long.
  427. X
  428. X-----------------------------------------------------------------------------
  429. X
  430. X   The type "size_t" should really be made into a separate type, with a
  431. X   function to cast to type "size_t".  This function would always do
  432. X   the cast unless sizeof(int) == sizeof(long), or unless the expression
  433. X   only involves constants and objects or functions of type "size_t".
  434. X
  435. X-----------------------------------------------------------------------------
  436. X
  437. X   Finish the Turbo Pascal features (in the file turbo.imp).
  438. X
  439. X-----------------------------------------------------------------------------
  440. X
  441. X   Are there any ways to take advantage of "x ?: y" in GCC?
  442. X   Is it worth using GCC constructor expressions for procedure variables?
  443. X   How about generating "volatile" and "const" for suitable functions?
  444. X      (doing this in the .h file would be very difficult...)
  445. X   Use the "asm" notation of 5.17 to implement var x ['y'] declarations.
  446. X
  447. X-----------------------------------------------------------------------------
  448. X
  449. X   Recognize GCC extensions in pc_expr().  (By the way, remember
  450. X   to implement += and friends in pc_expr(), too!)
  451. X
  452. X-----------------------------------------------------------------------------
  453. X
  454. X   Lightspeed C can't handle "typedef char foo[];" which arises from a
  455. X   MAXINT-sized array type declaration.
  456. X
  457. X-----------------------------------------------------------------------------
  458. X
  459. X   "Return" and friends are only introduced once.  In code of the form:
  460. X
  461. X      if (!done) { foo(); }  if (!done) { bar(); }
  462. X
  463. X    p2c should, after patching up bar(), check if the foo() branch is
  464. X    now also ripe for rearranging.
  465. X
  466. X-----------------------------------------------------------------------------
  467. X
  468. X   Have a global "paranoia" flag.  Default=use current defaults for other
  469. X   options.  1=conservative defaults for other options.  0=sloppy defaults
  470. X   for other options.
  471. X
  472. X-----------------------------------------------------------------------------
  473. X
  474. X   Rather than just generating a note, have writes of attribute characters
  475. X   convert into calls to a "set attribute" procedure, such as nc_sethighlight.
  476. X   Is there any way of generalizing this into something useful for
  477. X   non-HP-Pascal-workstation users?
  478. X
  479. X-----------------------------------------------------------------------------
  480. X
  481. X   Warn when character constants which are control codes are produced.
  482. X   (E.g., arrow keys, etc.)  Also, have an option which deletes all
  483. X   highlighting codes from strings being output.
  484. X
  485. X-----------------------------------------------------------------------------
  486. X
  487. X   Think how nice things would be if the arithmetic routines actually
  488. X   maintained the distinction between tp_int and tp_integer themselves,
  489. X   so that makeexpr_longcast didn't have to second-guess them.
  490. X
  491. X-----------------------------------------------------------------------------
  492. X
  493. X   Importing FS *still* copies its "file support" comment into the importing
  494. X   program!
  495. X
  496. X-----------------------------------------------------------------------------
  497. X
  498. X   Should parameterize those last few hard-wired names, such as "P_eoln",
  499. X   "LONG_MAX", ... ?
  500. X
  501. X-----------------------------------------------------------------------------
  502. X
  503. X   Check if we need to cache away any more options' values, as we did for
  504. X   VarStrings.  How about FoldConstants, SetBits, CopyStructs?
  505. X
  506. X
  507. X=============================================================================
  508. X
  509. X
  510. X   Support the "CSignif" option (by not generating C identifiers which
  511. X   would not be unique if only that many characters were significant).
  512. X
  513. X-----------------------------------------------------------------------------
  514. X
  515. X   What if a procedure accesses strmax of a var-string parameter of a
  516. X   parent procedure?  (Right now this generates a note.)
  517. X
  518. X-----------------------------------------------------------------------------
  519. X
  520. X   Handle full constructors for strings.
  521. X   Handle small-array constants.
  522. X
  523. X-----------------------------------------------------------------------------
  524. X
  525. X   Have an option that causes ANYVAR's to be translated to void *'s.  In
  526. X   this mode, all uses of ANYVAR variables will need to be cast to the
  527. X   proper type, in the function body rather than in calls to the function.
  528. X
  529. X-----------------------------------------------------------------------------
  530. X
  531. X   Handle reading enums.  Add full error checking for reading booleans.
  532. X   (And integer subranges?)
  533. X
  534. X-----------------------------------------------------------------------------
  535. X
  536. X   Support the "BigSetConst" option by creating constant arrays just as the
  537. X   Pascal compiler does.
  538. X
  539. X-----------------------------------------------------------------------------
  540. X
  541. X   The 2^(N+1) - 2^M method for generating [M..N] is not safe if N is 31.
  542. X   If the small-sets we are dealing with encompass the value 31 (== setbits-1)
  543. X   then we must use the bitwise construction instead.  (Currently, the
  544. X   translator just issues a note.)
  545. X
  546. X   (If N is 31, 2^32 will most likely evaluate to 0 on most machines, which
  547. X   is the correct value.  So this is only a minor problem.)
  548. X
  549. X-----------------------------------------------------------------------------
  550. X
  551. X   Big-set constants right now are always folded.  Provide a mechanism
  552. X   for defined set constants, say by having a #define with an argument
  553. X   which is the name of the temporary variable to use for the set.
  554. X
  555. X-----------------------------------------------------------------------------
  556. X
  557. X   Should we convert NA_LONGWORD-type variants into C casts?
  558. X
  559. X-----------------------------------------------------------------------------
  560. X
  561. X   Are there implementations of strcpy that do not return their first
  562. X   argument?  If so, should have an option that says so.
  563. X
  564. X-----------------------------------------------------------------------------
  565. X
  566. X   Handle absolute-addressed variables better.  For  var a[12345]:integer,
  567. X   create an initialized int *.  For  var a['foo']:integer, create an int *
  568. X   which is initialized to NULL and accessed by a macro which locates the
  569. X   symbol the first time the variable is used.
  570. X
  571. X-----------------------------------------------------------------------------
  572. X
  573. X   Handle the idiom, "reset(f, name); open(f);"
  574. X
  575. X-----------------------------------------------------------------------------
  576. X
  577. X   Should have an option that lowercases all file names used in "reset",
  578. X   "fixfname", etc.  This should be on by default.
  579. X
  580. X-----------------------------------------------------------------------------
  581. X
  582. X   Add more complete support for conformant arrays.  Specifically, support
  583. X   non-GNU compilers by converting variable-sized array declarations into
  584. X   pointer declarations with calls to alloca or malloc/free (what if the
  585. X   function uses free and contains return statements)?  Also convert
  586. X   variable-array references into explicit index arithmetic.
  587. X
  588. X-----------------------------------------------------------------------------
  589. X
  590. X   Have a mode in which the body of a TRY-RECOVER is moved out into
  591. X   a sub-procedure all its own, communicating with the parent through
  592. X   varstructs as usual, so that the ANSI C warning about what longjmp
  593. X   can do to the local variables is avoided.  Alternatively, have an
  594. X   option in which all necessary locals are declared volatile when
  595. X   setjmps are present.
  596. X
  597. X-----------------------------------------------------------------------------
  598. X
  599. X   If a sub-procedure refers to a parent's variable with the VAX Pascal
  600. X   [STATIC] attribute, that variable is declared "static" inside the
  601. X   varstruct!  Need to convert it into a varref to a static variable in
  602. X   the parent.
  603. X
  604. X-----------------------------------------------------------------------------
  605. X
  606. X   When comparing records and arrays a la UCSD Pascal, should expand
  607. X   into an "&&" expression comparing each field individually.  (What about
  608. X   variants?  Maybe just compare the first variant, or the tagged
  609. X   variant.)  Probably best to write a struct-comparison function the
  610. X   first time a given type of struct is compared; that way, the function
  611. X   can include a complete if tree or switch statement in the case of
  612. X   tagged unions.
  613. X
  614. X-----------------------------------------------------------------------------
  615. X
  616. X   In the checkvarchanged code, take aliasing of VAR parameters into account.
  617. X   For example, in "procedure p(s1 : string; var s2 : string)" p2c now avoids
  618. X   copying s1 if s1 is not changed within p, but probably should also require
  619. X   that s2 not change, or at least that s1 have been read and used before s2
  620. X   is changed.
  621. X
  622. X-----------------------------------------------------------------------------
  623. X
  624. X   Provide an option that tells the code generator to provide helpful
  625. X   comments of its own when generated code may be obscure.
  626. X
  627. X
  628. X=============================================================================
  629. X
  630. X
  631. X   Compact the various data structures.  In particular, typical runs
  632. X   show the majority of memory is used by Meanings and Symbols for
  633. X   global and imported objects.
  634. X
  635. X-----------------------------------------------------------------------------
  636. X
  637. X   The program wastes memory.  Find ways to reduce memory usage, and to
  638. X   avoid leaving dead records on the heap.  (Garbage collection?  Yuck!)
  639. X   (Maybe GC between each function declaration would be okay.)
  640. X
  641. X-----------------------------------------------------------------------------
  642. X
  643. X   Assign better names to temporaries.  Also, could avoid making redundant
  644. X   temporaries by generating a unique temporary every time one is needed,
  645. X   then crunching them down at the end just before the declarations are
  646. X   written out.  Each temporary would maintain a list of all the other
  647. X   temporaries (of the same type) with which it would conflict.  (This
  648. X   would avoid the current method's waste when several temps are created,
  649. X   then most are cancelled.)  Also, note that char STR1[10], STR2[20] can
  650. X   be considered type-compatible and merged into STR[20].
  651. X
  652. X-----------------------------------------------------------------------------
  653. X
  654. X   Don't generate _STR_xxx structure names if they aren't forward-referenced.
  655. X
  656. X-----------------------------------------------------------------------------
  657. X
  658. X   Can optimize, e.g., "strpos(a,b) = 0" to a call to strstr() or strchr(),
  659. X   even though these ANSI functions are not Pascal-like enough to use in 
  660. X   the general case.
  661. X
  662. X-----------------------------------------------------------------------------
  663. X
  664. X   Complete the handling of "usecommas=0" mode.
  665. X
  666. X-----------------------------------------------------------------------------
  667. X
  668. X   Optimize "s := strltrim(s)", "s := strrtrim(s)", and both together.
  669. X
  670. X-----------------------------------------------------------------------------
  671. X
  672. X   Convert "(ch < 'a') or (ch > 'z')" to "!islower(ch)", and so on.
  673. X   Also do "!islower(ch) && !isupper(ch)" => "!isalpha(ch)", etc.
  674. X
  675. X-----------------------------------------------------------------------------
  676. X
  677. X   Find other cases in which to call mixassignments().
  678. X
  679. X-----------------------------------------------------------------------------
  680. X
  681. X   The sequence:   sprintf(buf + strlen(buf), "...", ...);
  682. X                   sprintf(buf + strlen(buf), "...", ...);
  683. X   could be changed to a single sprintf.
  684. X   Also, "sprintf(temp, "...%s", ..., buf); strcpy(buf, temp); (above);"
  685. X   could be crunched down.  (This comes from strinsert, then strappend.)
  686. X
  687. X-----------------------------------------------------------------------------
  688. X
  689. X   If there is only one assignment to a structured function's return
  690. X   variable, and that assignment is at the very end and assigns a local
  691. X   variable to the return variable, then merge the variables.
  692. X   (Example: name_list in netcmp's datastruct module.  RET_name_list
  693. X   should be renamed to namestr.)
  694. X
  695. X-----------------------------------------------------------------------------
  696. X
  697. X   Have an option that causes if-then-else's to be replaced by ? :'s in
  698. X   certain cases.  If the branches of the if are either both returns or
  699. X   both assignments to the same variable, which has no side effects, and
  700. X   if the whole conditional will be simple enough to fit on one line when
  701. X   printed, then the ? : transformation is okay.
  702. X
  703. X-----------------------------------------------------------------------------
  704. X
  705. X   Have an option that makes limited use of variable initialization.
  706. X   If the first statement of a function is an assignment of a constant
  707. X   to a local variable, then the assignment is changed to an initialization.
  708. X   (Non-constant initializers are probably too hard to check for safety.)
  709. X   Should variables with initializers still be mixed?
  710. X   (Example: valid_node_class in netcmp's datastructs module.)
  711. X   File variable initialization is an especially good application for this.
  712. X
  713. X-----------------------------------------------------------------------------
  714. X
  715. X   Have an option that finds cases of multiple assignment.  For example:
  716. X      a := x; b := x;   =>  a = b = x;
  717. X      a := x; b := a;   =>  a = b = x;
  718. X   (provided the objects in question have the same type).
  719. X
  720. X-----------------------------------------------------------------------------
  721. X
  722. X   Need an option that causes $if$'s to change to #if's, instead of being
  723. X   evaluated at translation-time.  (This is *really hard* in general;
  724. X   do it for some common cases, such as entire statements being commented
  725. X   out, or fields being commented out of records.)
  726. X
  727. X-----------------------------------------------------------------------------
  728. X
  729. X   Have an option that prevents generation and inclusion of .h files for
  730. X   modules; instead, each module would contain extern declarations for
  731. X   the things it imports.  (Only declare names that are actually used---
  732. X   this means the declarations will have to be emitted on a procedure-by-
  733. X   procedure basis.)
  734. X
  735. X-----------------------------------------------------------------------------
  736. X
  737. X   Extend the ExpandIncludes option to compile include files as separate
  738. X   stand-alone C modules.  The hard part is warning when the new module
  739. X   uses a procedure which was declared static in an earlier C module.
  740. X   Remember to re-emit all the proper #include's at the beginning.
  741. X   Anything else?
  742. X
  743. X-----------------------------------------------------------------------------
  744. X
  745. X   Consider an option where the variables in a varStruct are made into
  746. X   globals instead, or into parameters if there are few of them.
  747. X
  748. X-----------------------------------------------------------------------------
  749. X
  750. X   Perform a flow analysis after everything else is done; use this to
  751. X   eliminate redundant checks, e.g., for nil pointers or non-open or
  752. X   already-open files.  Also eliminate redundant "j" variables for
  753. X   strwrite statements.
  754. X
  755. X-----------------------------------------------------------------------------
  756. X
  757. X   Need a method for simple pattern matching predicates in FuncMacros.
  758. X   For example, allow special translations of functions where a given
  759. X   argument is a known constant, or known to be positive, or two
  760. X   arguments are the same, etc.
  761. X
  762. X-----------------------------------------------------------------------------
  763. X
  764. X   Have some way to provide run-time templates for fixblock/fixexpr-like
  765. X   applications.  The user enters two C expressions A and B, possibly including
  766. X   Prolog-like logical variables.  If fixexpr sees an expression matching A,
  767. X   it rewrites it into the form of B.
  768. X
  769. X-----------------------------------------------------------------------------
  770. X
  771. X   Have an option to cause selected Pascal procedures or functions to be
  772. X   expanded in-line.  Do this either by generating the keyword "inline",
  773. X   or by doing the expansion in the translator.
  774. X
  775. X-----------------------------------------------------------------------------
  776. X
  777. X   Technically speaking, strcmp shouldn't be used to compute < and > for
  778. X   strings on a machine with signed chars.  Should we care?
  779. X
  780. X-----------------------------------------------------------------------------
  781. X
  782. X   Have an option for creating a "display" of LINK pointers local to a
  783. X   function.  Should only create such pointers for static levels which are
  784. X   referred to in the function body.
  785. X
  786. X-----------------------------------------------------------------------------
  787. X
  788. X
  789. END_OF_FILE
  790. if test 33044 -ne `wc -c <'src/NOTES'`; then
  791.     echo shar: \"'src/NOTES'\" unpacked with wrong size!
  792. fi
  793. # end of 'src/NOTES'
  794. fi
  795. echo shar: End of archive 11 \(of 32\).
  796. cp /dev/null ark11isdone
  797. MISSING=""
  798. 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
  799.     if test ! -f ark${I}isdone ; then
  800.     MISSING="${MISSING} ${I}"
  801.     fi
  802. done
  803. if test "${MISSING}" = "" ; then
  804.     echo You have unpacked all 32 archives.
  805.     echo "Now see PACKNOTES and the README"
  806.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  807. else
  808.     echo You still need to unpack the following archives:
  809.     echo "        " ${MISSING}
  810. fi
  811. ##  End of shell archive.
  812. exit 0
  813.