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

  1. Subject:  v21i052:  Pascal to C translator, Part07/32
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: bf876f14 04e14e8f 2bae0911 4dd94a49
  5.  
  6. Submitted-by: Dave Gillespie <daveg@csvax.caltech.edu>
  7. Posting-number: Volume 21, Issue 52
  8. Archive-name: p2c/part07
  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 7 (of 32)."
  17. # Contents:  examples/basic.p.2 src/HISTORY
  18. # Wrapped by rsalz@litchi.bbn.com on Mon Mar 26 14:29:31 1990
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'examples/basic.p.2' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'examples/basic.p.2'\"
  22. else
  23. echo shar: Extracting \"'examples/basic.p.2'\" \(18419 characters\)
  24. sed "s/^X//" >'examples/basic.p.2' <<'END_OF_FILE'
  25. X                  if v^.sval^ <> nil then
  26. X                     dispose(v^.sval^);
  27. X                  new(v^.sval^);
  28. X                  v^.sval^^ := s;
  29. X                  if not iseos then
  30. X                     begin
  31. X                        require(tokcomma);
  32. X                        write('?? ');
  33. X                     end;
  34. X               until iseos;
  35. X            end
  36. X         else
  37. X            begin
  38. X               readln(s);
  39. X               parse(addr(s), tok);
  40. X               tok0 := tok;
  41. X               repeat
  42. X                  v := findvar;
  43. X                  while tok = nil do
  44. X                     begin
  45. X                        write('?? ');
  46. X                        readln(s);
  47. X                        disposetokens(tok0);
  48. X                        parse(addr(s), tok);
  49. X                        tok0 := tok;
  50. X                     end;
  51. X                  tok1 := t;
  52. X                  t := tok;
  53. X                  v^.val^ := realexpr;
  54. X                  if t <> nil then
  55. X                     if t^.kind = tokcomma then
  56. X                        t := t^.next
  57. X                     else
  58. X                        snerr;
  59. X                  tok := t;
  60. X                  t := tok1;
  61. X                  if not iseos then
  62. X                     require(tokcomma);
  63. X               until iseos;
  64. X               disposetokens(tok0);
  65. X            end;
  66. X      end;
  67. X
  68. X
  69. X   procedure cmdlet(implied : boolean);
  70. X      var
  71. X         v : varptr;
  72. X     old : basicstring;
  73. X      begin
  74. X         if implied then
  75. X            t := stmttok;
  76. X         v := findvar;
  77. X         require(tokeq);
  78. X         if v^.stringvar then
  79. X            begin
  80. X               old := v^.sval^;
  81. X               v^.sval^ := strexpr;
  82. X               if old <> nil then
  83. X                  dispose(old);
  84. X            end
  85. X         else
  86. X            v^.val^ := realexpr;
  87. X      end;
  88. X
  89. X
  90. X   procedure cmdgoto;
  91. X      begin
  92. X         stmtline := mustfindline(intexpr);
  93. X         t := nil;
  94. X         gotoflag := true;
  95. X      end;
  96. X
  97. X
  98. X   procedure cmdif;
  99. X      var
  100. X         n : real;
  101. X         i : integer;
  102. X      begin
  103. X         n := realexpr;
  104. X         require(tokthen);
  105. X         if n = 0 then
  106. X            begin
  107. X               i := 0;
  108. X               repeat
  109. X                  if t <> nil then
  110. X                     begin
  111. X                        if t^.kind = tokif then
  112. X                           i := i + 1;
  113. X                        if t^.kind = tokelse then
  114. X                           i := i - 1;
  115. X                        t := t^.next;
  116. X                     end;
  117. X               until (t = nil) or (i < 0);
  118. X            end;
  119. X         if (t <> nil) and (t^.kind = toknum) then
  120. X            cmdgoto
  121. X         else
  122. X            elseflag := true;
  123. X      end;
  124. X
  125. X
  126. X   procedure cmdelse;
  127. X      begin
  128. X         t := nil;
  129. X      end;
  130. X
  131. X
  132. X   function skiploop(up, dn : tokenkinds) : boolean;
  133. X      label 1;
  134. X      var
  135. X         i : integer;
  136. X         saveline : lineptr;
  137. X      begin
  138. X         saveline := stmtline;
  139. X         i := 0;
  140. X         repeat
  141. X            while t = nil do
  142. X               begin
  143. X                  if (stmtline = nil) or (stmtline^.next = nil) then
  144. X                     begin
  145. X                        skiploop := false;
  146. X                        stmtline := saveline;
  147. X                        goto 1;
  148. X                     end;
  149. X                  stmtline := stmtline^.next;
  150. X                  t := stmtline^.txt;
  151. X               end;
  152. X            if t^.kind = up then
  153. X               i := i + 1;
  154. X            if t^.kind = dn then
  155. X               i := i - 1;
  156. X            t := t^.next;
  157. X         until i < 0;
  158. X         skiploop := true;
  159. X     1 :
  160. X      end;
  161. X
  162. X
  163. X   procedure cmdfor;
  164. X      var
  165. X         l : loopptr;
  166. X         lr : looprec;
  167. X         saveline : lineptr;
  168. X         i, j : integer;
  169. X      begin
  170. X         lr.vp := findvar;
  171. X         if lr.vp^.stringvar then snerr;
  172. X         require(tokeq);
  173. X         lr.vp^.val^ := realexpr;
  174. X         require(tokto);
  175. X         lr.max := realexpr;
  176. X         if (t <> nil) and (t^.kind = tokstep) then
  177. X            begin
  178. X               t := t^.next;
  179. X               lr.step := realexpr;
  180. X            end
  181. X         else
  182. X            lr.step := 1;
  183. X         lr.homeline := stmtline;
  184. X         lr.hometok := t;
  185. X         lr.kind := forloop;
  186. X         lr.next := loopbase;
  187. X         with lr do
  188. X            if ((step >= 0) and (vp^.val^ > max)) or ((step <= 0) and (vp^.val^ < max)) then
  189. X               begin
  190. X                  saveline := stmtline;
  191. X                  i := 0;
  192. X                  j := 0;
  193. X                  repeat
  194. X                     while t = nil do
  195. X                        begin
  196. X                           if (stmtline = nil) or (stmtline^.next = nil) then
  197. X                              begin
  198. X                                 stmtline := saveline;
  199. X                                 errormsg('FOR without NEXT');
  200. X                              end;
  201. X                           stmtline := stmtline^.next;
  202. X                           t := stmtline^.txt;
  203. X                        end;
  204. X                     if t^.kind = tokfor then
  205. X                        if (t^.next <> nil) and (t^.next^.kind = tokvar) and (t^.next^.vp = vp) then
  206. X                           j := j + 1
  207. X                        else
  208. X                           i := i + 1;
  209. X                     if (t^.kind = toknext) then
  210. X                        if (t^.next <> nil) and (t^.next^.kind = tokvar) and (t^.next^.vp = vp) then
  211. X                           j := j - 1
  212. X                        else
  213. X                           i := i - 1;
  214. X                     t := t^.next;
  215. X                  until (i < 0) or (j < 0);
  216. X                  skiptoeos;
  217. X               end
  218. X            else
  219. X               begin
  220. X                  new(l);
  221. X                  l^ := lr;
  222. X                  loopbase := l;
  223. X               end;
  224. X      end;
  225. X
  226. X
  227. X   procedure cmdnext;
  228. X      var
  229. X         v : varptr;
  230. X         found : boolean;
  231. X         l : loopptr;
  232. X      begin
  233. X         if not iseos then
  234. X            v := findvar
  235. X         else
  236. X            v := nil;
  237. X         repeat
  238. X            if (loopbase = nil) or (loopbase^.kind = gosubloop) then 
  239. X               errormsg('NEXT without FOR');
  240. X            found := (loopbase^.kind = forloop) and
  241. X                     ((v = nil) or (loopbase^.vp = v));
  242. X            if not found then
  243. X               begin
  244. X                  l := loopbase^.next;
  245. X                  dispose(loopbase);
  246. X                  loopbase := l;
  247. X               end;
  248. X         until found;
  249. X         with loopbase^ do
  250. X            begin
  251. X               vp^.val^ := vp^.val^ + step;
  252. X               if ((step >= 0) and (vp^.val^ > max)) or ((step <= 0) and (vp^.val^ < max)) then
  253. X                  begin
  254. X                     l := loopbase^.next;
  255. X                     dispose(loopbase);
  256. X                     loopbase := l;
  257. X                  end
  258. X               else
  259. X                  begin
  260. X                     stmtline := homeline;
  261. X                     t := hometok;
  262. X                  end;
  263. X            end;
  264. X      end;
  265. X
  266. X
  267. X   procedure cmdwhile;
  268. X      var
  269. X         l : loopptr;
  270. X      begin
  271. X         new(l);
  272. X         l^.next := loopbase;
  273. X         loopbase := l;
  274. X         l^.kind := whileloop;
  275. X         l^.homeline := stmtline;
  276. X         l^.hometok := t;
  277. X         if not iseos then
  278. X            if realexpr = 0 then
  279. X               begin
  280. X                  if not skiploop(tokwhile, tokwend) then 
  281. X                     errormsg('WHILE without WEND');
  282. X                  l := loopbase^.next;
  283. X                  dispose(loopbase);
  284. X                  loopbase := l;
  285. X                  skiptoeos;
  286. X               end;
  287. X      end;
  288. X
  289. X
  290. X   procedure cmdwend;
  291. X      var
  292. X         tok : tokenptr;
  293. X         tokline : lineptr;
  294. X         l : loopptr;
  295. X         found : boolean;
  296. X      begin
  297. X         repeat
  298. X            if (loopbase = nil) or (loopbase^.kind = gosubloop) then
  299. X               errormsg('WEND without WHILE');
  300. X            found := (loopbase^.kind = whileloop);
  301. X            if not found then
  302. X               begin
  303. X                  l := loopbase^.next;
  304. X                  dispose(loopbase);
  305. X                  loopbase := l;
  306. X               end;
  307. X         until found;
  308. X         if not iseos then
  309. X            if realexpr <> 0 then
  310. X               found := false;
  311. X         tok := t;
  312. X         tokline := stmtline;
  313. X         if found then
  314. X            begin
  315. X               stmtline := loopbase^.homeline;
  316. X               t := loopbase^.hometok;
  317. X               if not iseos then
  318. X                  if realexpr = 0 then
  319. X                     found := false;
  320. X            end;
  321. X         if not found then
  322. X            begin
  323. X               t := tok;
  324. X               stmtline := tokline;
  325. X               l := loopbase^.next;
  326. X               dispose(loopbase);
  327. X               loopbase := l;
  328. X            end;
  329. X      end;
  330. X
  331. X
  332. X   procedure cmdgosub;
  333. X      var
  334. X         l : loopptr;
  335. X      begin
  336. X         new(l);
  337. X         l^.next := loopbase;
  338. X         loopbase := l;
  339. X         l^.kind := gosubloop;
  340. X         l^.homeline := stmtline;
  341. X         l^.hometok := t;
  342. X         cmdgoto;
  343. X      end;
  344. X
  345. X
  346. X   procedure cmdreturn;
  347. X      var
  348. X         l : loopptr;
  349. X         found : boolean;
  350. X      begin
  351. X         repeat
  352. X            if loopbase = nil then
  353. X               errormsg('RETURN without GOSUB');
  354. X            found := (loopbase^.kind = gosubloop);
  355. X            if not found then
  356. X               begin
  357. X                  l := loopbase^.next;
  358. X                  dispose(loopbase);
  359. X                  loopbase := l;
  360. X               end;
  361. X         until found;
  362. X         stmtline := loopbase^.homeline;
  363. X         t := loopbase^.hometok;
  364. X         l := loopbase^.next;
  365. X         dispose(loopbase);
  366. X         loopbase := l;
  367. X         skiptoeos;
  368. X      end;
  369. X
  370. X
  371. X   procedure cmdread;
  372. X      var
  373. X         v : varptr;
  374. X         tok : tokenptr;
  375. X         found : boolean;
  376. X      begin
  377. X         repeat
  378. X            v := findvar;
  379. X            tok := t;
  380. X            t := datatok;
  381. X            if dataline = nil then
  382. X               begin
  383. X                  dataline := linebase;
  384. X                  t := dataline^.txt;
  385. X               end;
  386. X            if (t = nil) or (t^.kind <> tokcomma) then
  387. X               repeat
  388. X                  while t = nil do
  389. X                     begin
  390. X                        if (dataline = nil) or (dataline^.next = nil) then
  391. X                           errormsg('Out of Data');
  392. X                        dataline := dataline^.next;
  393. X                        t := dataline^.txt;
  394. X                     end;
  395. X                  found := (t^.kind = tokdata);
  396. X                  t := t^.next;
  397. X               until found and not iseos
  398. X            else
  399. X               t := t^.next;
  400. X            if v^.stringvar then
  401. X               begin
  402. X                  if v^.sval^ <> nil then
  403. X                     dispose(v^.sval^);
  404. X                  v^.sval^ := strexpr;
  405. X               end
  406. X            else
  407. X               v^.val^ := realexpr;
  408. X            datatok := t;
  409. X            t := tok;
  410. X            if not iseos then
  411. X               require(tokcomma);
  412. X         until iseos;
  413. X      end;
  414. X
  415. X
  416. X   procedure cmddata;
  417. X      begin
  418. X         skiptoeos;
  419. X      end;
  420. X
  421. X
  422. X   procedure cmdrestore;
  423. X      begin
  424. X         if iseos then
  425. X            restoredata
  426. X         else
  427. X            begin
  428. X               dataline := mustfindline(intexpr);
  429. X               datatok := dataline^.txt;
  430. X            end;
  431. X      end;
  432. X
  433. X
  434. X   procedure cmdgotoxy;
  435. X      var
  436. X         i : integer;
  437. X      begin
  438. X         i := intexpr;
  439. X         require(tokcomma);
  440. X         gotoxy(i, intexpr);
  441. X      end;
  442. X
  443. X
  444. X   procedure cmdon;
  445. X      var
  446. X         i : integer;
  447. X         l : loopptr;
  448. X      begin
  449. X         i := intexpr;
  450. X         if (t <> nil) and (t^.kind = tokgosub) then
  451. X            begin
  452. X               new(l);
  453. X               l^.next := loopbase;
  454. X               loopbase := l;
  455. X               l^.kind := gosubloop;
  456. X               l^.homeline := stmtline;
  457. X               l^.hometok := t;
  458. X               t := t^.next;
  459. X            end
  460. X         else
  461. X            require(tokgoto);
  462. X         if i < 1 then
  463. X            skiptoeos
  464. X         else
  465. X            begin
  466. X               while (i > 1) and not iseos do
  467. X                  begin
  468. X                     require(toknum);
  469. X                     if not iseos then
  470. X                        require(tokcomma);
  471. X                     i := i - 1;
  472. X                  end;
  473. X               if not iseos then
  474. X                  cmdgoto;
  475. X            end;
  476. X      end;
  477. X
  478. X
  479. X   procedure cmddim;
  480. X      var
  481. X         i, j, k : integer;
  482. X         v : varptr;
  483. X         done : boolean;
  484. X      begin
  485. X         repeat
  486. X            if (t = nil) or (t^.kind <> tokvar) then snerr;
  487. X            v := t^.vp;
  488. X            t := t^.next;
  489. X            with v^ do
  490. X               begin
  491. X                  if numdims <> 0 then
  492. X                     errormsg('Array already dimensioned');
  493. X                  j := 1;
  494. X                  i := 0;
  495. X                  require(toklp);
  496. X                  repeat
  497. X                     k := intexpr + 1;
  498. X                     if k < 1 then badsubscr;
  499. X                     if i >= maxdims then badsubscr;
  500. X                     i := i + 1;
  501. X                     dims[i] := k;
  502. X                     j := j * k;
  503. X                     done := (t <> nil) and (t^.kind = tokrp);
  504. X                     if not done then
  505. X                        require(tokcomma);
  506. X                  until done;
  507. X                  t := t^.next;
  508. X                  numdims := i;
  509. X                  if stringvar then
  510. X                     begin
  511. X                        hpm_new(sarr, j*4);
  512. X                        for i := 0 to j-1 do
  513. X                           sarr^[i] := nil;
  514. X                     end
  515. X                  else
  516. X                     begin
  517. X                        hpm_new(arr, j*8);
  518. X                        for i := 0 to j-1 do
  519. X                           arr^[i] := 0;
  520. X                     end;
  521. X               end;
  522. X            if not iseos then
  523. X               require(tokcomma);
  524. X         until iseos;
  525. X      end;
  526. X
  527. X
  528. X   procedure cmdpoke;
  529. X      var
  530. X         trick :
  531. X            record
  532. X               case boolean of
  533. X                  true : (i : integer);
  534. X                  false : (c : ^char);
  535. X            end;
  536. X      begin
  537. X         $range off$
  538. X         trick.i := intexpr;
  539. X         require(tokcomma);
  540. X         trick.c^ := chr(intexpr);
  541. X         $if checking$ $range on$ $end$
  542. X      end;
  543. X
  544. X
  545. X   begin {exec}
  546. X      try
  547. X         repeat
  548. X            repeat
  549. X               gotoflag := false;
  550. X               elseflag := false;
  551. X               while (stmttok <> nil) and (stmttok^.kind = tokcolon) do
  552. X                  stmttok := stmttok^.next;
  553. X               t := stmttok;
  554. X               if t <> nil then
  555. X                  begin
  556. X                     t := t^.next;
  557. X                     case stmttok^.kind of
  558. X                        tokrem     : ;
  559. X                        toklist    : cmdlist;
  560. X                        tokrun     : cmdrun;
  561. X                        toknew     : cmdnew;
  562. X                        tokload    : cmdload(false, stringexpr);
  563. X                        tokmerge   : cmdload(true, stringexpr);
  564. X                        toksave    : cmdsave;
  565. X                        tokbye     : cmdbye;
  566. X                        tokdel     : cmddel;
  567. X                        tokrenum   : cmdrenum;
  568. X                        toklet     : cmdlet(false);
  569. X                        tokvar     : cmdlet(true);
  570. X                        tokprint   : cmdprint;
  571. X                        tokinput   : cmdinput;
  572. X                        tokgoto    : cmdgoto;
  573. X                        tokif      : cmdif;
  574. X                        tokelse    : cmdelse;
  575. X                        tokend     : cmdend;
  576. X                        tokstop    : escape(-20);
  577. X                        tokfor     : cmdfor;
  578. X                        toknext    : cmdnext;
  579. X                        tokwhile   : cmdwhile;
  580. X                        tokwend    : cmdwend;
  581. X                        tokgosub   : cmdgosub;
  582. X                        tokreturn  : cmdreturn;
  583. X                        tokread    : cmdread;
  584. X                        tokdata    : cmddata;
  585. X                        tokrestore : cmdrestore;
  586. X                        tokgotoxy  : cmdgotoxy;
  587. X                        tokon      : cmdon;
  588. X                        tokdim     : cmddim;
  589. X                        tokpoke    : cmdpoke;
  590. X                     otherwise
  591. X                        errormsg('Illegal command');
  592. X                     end;
  593. X                  end;
  594. X               if not elseflag and not iseos then
  595. X                  checkextra;
  596. X               stmttok := t;
  597. X            until t = nil;
  598. X            if stmtline <> nil then
  599. X               begin
  600. X                  if not gotoflag then
  601. X                     stmtline := stmtline^.next;
  602. X                  if stmtline <> nil then
  603. X                     stmttok := stmtline^.txt;
  604. X               end;
  605. X         until stmtline = nil;
  606. X      recover
  607. X         begin
  608. X            if escapecode = -20 then
  609. X               begin
  610. X                  write('Break');
  611. X               end
  612. X            else if escapecode = 42 then
  613. X               begin end
  614. X            else
  615. X               case escapecode of
  616. X                  -4 : write(#7'Integer overflow');
  617. X                  -5 : write(#7'Divide by zero');
  618. X                  -6 : write(#7'Real math overflow');
  619. X                  -7 : write(#7'Real math underflow');
  620. X                  -8, -19..-15 : write(#7'Value range error');
  621. X                  -10 :
  622. X                     begin
  623. X                        new(ioerrmsg);
  624. X                        misc_getioerrmsg(ioerrmsg^, ioresult);
  625. X                        write(#7, ioerrmsg^);
  626. X                        dispose(ioerrmsg);
  627. X                     end;
  628. X                  otherwise
  629. X                     begin
  630. X                        if excp_line <> -1 then
  631. X                           writeln(excp_line);
  632. X                        escape(escapecode);
  633. X                     end;
  634. X               end;
  635. X            if stmtline <> nil then
  636. X               write(' in ', stmtline^.num:1);
  637. X            writeln;
  638. X         end;
  639. X   end; {exec}
  640. X
  641. X
  642. X
  643. X
  644. X
  645. Xbegin {main}
  646. X   new(inbuf);
  647. X   linebase := nil;
  648. X   varbase := nil;
  649. X   loopbase := nil;
  650. X   writeln('Chipmunk BASIC 1.0');
  651. X   writeln;
  652. X   exitflag := false;
  653. X   repeat
  654. X      try
  655. X         repeat
  656. X            write('>');
  657. X            readln(inbuf^);
  658. X            parseinput(buf);
  659. X            if curline = 0 then
  660. X               begin
  661. X                  stmtline := nil;
  662. X                  stmttok := buf;
  663. X                  if stmttok <> nil then
  664. X                     exec;
  665. X                  disposetokens(buf);
  666. X               end;
  667. X         until exitflag or eof(input);
  668. X      recover
  669. X         if escapecode <> -20 then
  670. X            misc_printerror(escapecode, ioresult)
  671. X         else
  672. X            writeln;
  673. X   until exitflag or eof(input);
  674. Xend.
  675. X
  676. X
  677. X
  678. X
  679. END_OF_FILE
  680. if test 18419 -ne `wc -c <'examples/basic.p.2'`; then
  681.     echo shar: \"'examples/basic.p.2'\" unpacked with wrong size!
  682. fi
  683. # end of 'examples/basic.p.2'
  684. fi
  685. if test -f 'src/HISTORY' -a "${1}" != "-c" ; then 
  686.   echo shar: Will not clobber existing file \"'src/HISTORY'\"
  687. else
  688. echo shar: Extracting \"'src/HISTORY'\" \(17901 characters\)
  689. sed "s/^X//" >'src/HISTORY' <<'END_OF_FILE'
  690. X
  691. X
  692. XSummary of changes to "p2c"
  693. X------- -- ------- --  ---
  694. X
  695. X
  696. XVersion 1.14:
  697. X
  698. X * Added partial support for Oregon Software Pascal's delete(f) procedure.
  699. X
  700. X * Changed file_iofunc to be a little more robust in case of errors.
  701. X
  702. X * Bug fix in p2clib.c:strrtrim: Changed to "while (*++s2) ;"
  703. X   Symptom: This function didn't do anything!
  704. X
  705. X * Bug fix in decl.c:p_type: Declared enums which were base types of sets.
  706. X   Symptom: In "type s = set of (a,b)", the enum was never declared.
  707. X
  708. X * Bug fix in decl.c:issafename: Avoided #defining existing field names.
  709. X   Symptom: "type r=record a:integer; end; const a=10;" produced bad code.
  710. X
  711. X * Bug fix in expr.c:makeexpr_charcast: Changed to recognize CONST names.
  712. X   Symptom: "const x='x'; var s : set of char; s := [x];" generated bad code.
  713. X
  714. XVersion 1.13:
  715. X
  716. X * Changed to interpret cpp-style "#include" as another include-file syntax.
  717. X
  718. X * Improved handling of WRITE field widths for packed arrays of char.
  719. X
  720. X * Improved handling of built-in identifiers in PascalCaseSens mode.
  721. X
  722. X * Bug fix in parse.c:p_function: used strcicmp to check for "FORWARD" keyword.
  723. X   Symptom: In PascalCaseSens mode, forward declarations had to be capitalized.
  724. X
  725. XVersion 1.12:
  726. X
  727. X * Added support for Sun/Berkeley Pascal.
  728. X
  729. X * Beefed up PascalCaseSens handling.
  730. X
  731. X * Added some extra parentheses to the P_clrbits macros. (!)
  732. X
  733. X * Added to sys.p2crc/trans.h the following configuration parameter:
  734. X
  735. X    CharFileText    Treat "file of char" as identical to "text".
  736. X    UseStrncmp        Use strncmp, not memcmp, to compare packed arrays of char.
  737. X    MessageStderr   Built-in "message(...)" should use stderr, not stdout.
  738. X    LiteralFiles    Files opened without names should use file var's name.
  739. X    LiteralFile        Specific files which should use LiteralFiles=1 mode.
  740. X
  741. XVersion 1.11:
  742. X
  743. X * Improved the "usage" message slightly.
  744. X
  745. X * Introduced "CollectNest=0" to help with include files of sub-procedures.
  746. X
  747. X * Changed to ignore "OVERLAY" keyword (a Turbo Pascal anachronism).
  748. X
  749. X * Introduced "BROKEN_OR" option in trans.h in case of compiler bugs.
  750. X
  751. X * Changed src/Makefile to check for presence of nroff before changing p2c.cat.
  752. X
  753. X * Taught strmax_func to understand string consts as well as string literals.
  754. X
  755. X * Changed system.imp to use __module to avoid ModuleNotation dependencies.
  756. X
  757. X * Prevented variables in varstructs from being declared "const".
  758. X
  759. X * Changed "checkvarchanged" in decl.c to observe constqual, volatilequal.
  760. X
  761. X * Introduced "expr_has_address" (in expr.c) as a variant on "expr_is_lvalue".
  762. X
  763. X * Bug fix in pexpr.c:p_funcarglist: for strings as conformant arrays, low=1.
  764. X   Symptom: Strings were passed as array [0..N] instead of [1..N].
  765. X
  766. X * Bug fix in decl.c:setupmeaning: added missing "break;" for MK_VARIANT case.
  767. X   Symptom: Special formatting for enumerated type names was broken.
  768. X
  769. X * Bug fix in p2c.h:P_getcmdline: removed "Const" keywords.
  770. X   Symptom: Prototype was inconsistent with definition in p2clib.c.
  771. X
  772. X * Bug fix in decl.c:addfield: changed to "tname && tname->name ? ...".
  773. X   Symptom: Reference to NULL formatting field names for unnamed records.
  774. X
  775. X * Bug fix in expr.c:fixblock: fixed getfbuf + get => fread to check var type.
  776. X   Symptom: "f:file of byte; i:integer; i:=f^; get(f);" used fread incorrectly.
  777. X
  778. X * Bug fix in lex.c:turbo_directive: checked return value of handle_include.
  779. X   Symptom: Turbo-style include directives messed up if file was not found.
  780. X
  781. X * Added to sys.p2crc/trans.h the following configuration parameter:
  782. X
  783. X    CollectNest     Kludge to make sub-procs be emitted as they are parsed.
  784. X
  785. XVersion 1.10:
  786. X
  787. X * Bug fix in comment.c:addnote: reference to "quiet" changed to "quietmode".
  788. X   Symptom: Failed to compile!  (Sorry, about that!)
  789. X
  790. XVersion 1.09:
  791. X
  792. X * Made a few improvements to "-R" (regression-testing) mode.
  793. X
  794. X * Bug fix in decl.c:addfield: rewrote part of the issafename loop.
  795. X   Symptom: Various problems choosing names for fields of structs.
  796. X
  797. X * Bug fix in out.c:getcurtime: modified non-HASTIME case to use starttime.
  798. X   Symptom: Not safe to multiply raw time() result by 1000.
  799. X
  800. XVersion 1.08:
  801. X
  802. X * Changed "makeproto" commands in src/Makefile to "./makeproto".
  803. X
  804. X * Extended "ConstFormat" mechanism for all other kinds of identifiers.
  805. X
  806. X * Added a special format for Pascal include-file names.
  807. X
  808. X * Added "UseConsts=2" to force the use of "Const" instead of "const".
  809. X
  810. X * Added FileNameFilter option.
  811. X
  812. X * Added "-E" switch to halt after some number of errors.
  813. X
  814. X * Added DeclBufNCName for compilers which can't handle null macro arguments.
  815. X
  816. X * Handled the case of multiple parameters using a common conformant schema.
  817. X
  818. X * Incorporated several Oregon Pascal standard procedures from William Bader.
  819. X
  820. X * Fixed typo in documentation of "BraceLine" in sys.p2crc.
  821. X
  822. X * Bug fix: in funcs.c:handleread_text: add copyexpr to P_read[ln]paoc calls.
  823. X   Symptom: Dangling pointer problems generating calls to P_read[ln]paoc.
  824. X
  825. X * Bug fix: in pexpr.c:dots_n_hats:TOK_LBR case: changed to use p_ord_expr().
  826. X   Symptom: Arrays indexed by literal characters used "A", not 'A'.
  827. X
  828. X * Bug fix: in pexpr.c:p_setfactor: added two makeexpr_longcast calls.
  829. X   Symptom: Generated code used "1 << x" instead of "1L << x" in a few places.
  830. X
  831. X * Bug fix: in decl.c:setup_decl: defined SWORD equivalent to tp_sshort.
  832. X   Symptom: Signed words were translated as longs under some circumstances.
  833. X
  834. X * Bug fix: in parse.c:fixblock: "if" rearrangements now clear if-else flags.
  835. X   Symptom: Else-ifs were formed in inappropriate places.
  836. X
  837. X * Bug fix: in parse.c:fixblock: "continue" added after final eatstmt call.
  838. X   Symptom: Reference to an already-freed pointer.
  839. X
  840. X * Added to sys.p2crc/trans.h the following configuration parameters:
  841. X
  842. X    ModuleFormat    Analogous to ConstFormat but for module names.
  843. X    FunctionFormat  Analogous to ConstFormat but for function names.
  844. X    VarFormat       Analogous to ConstFormat but for variable names.
  845. X    FieldFormat     Analogous to ConstFormat but for record field names.
  846. X    TypeFormat      Analogous to ConstFormat but for type names.
  847. X    EnumFormat      Analogous to ConstFormat, for enumeration constant names.
  848. X    IncludeFileName Format for include file names.
  849. X    FileNameFilter  Function to call to "clean" file names for use by fopen.
  850. X    MaxErrors        Number of errors/warnings/notes printed before aborting.
  851. X    DeclBufNCName   Version of DeclBufName with no "storage class" arg.
  852. X
  853. XVersion 1.07:
  854. X
  855. X * Added "Integer16=2" mode to translate Pascal "integer" as C "int".
  856. X
  857. X * Added a warning when "%" is used for MOD of arguments that may be negative.
  858. X
  859. X * Made formatted output of booleans and reals closer to Pascal standards.
  860. X
  861. X * Now print warning when trying to use associated buffers of file params.
  862. X
  863. X * Added support for buffered "file of array" types.
  864. X
  865. X * Prevented warning message when main program ends with ";" instead of ".".
  866. X
  867. X * Changed to ignore RESET and REWRITE on standard file OUTPUT.
  868. X
  869. X * Bug fix: in decl.c:p_constdecl: Added mp->isactive=0 / ... / mp->isactive=1.
  870. X   Symptom: "const ten=10; procedure p; const ten=ten;" failed.
  871. X
  872. X * Bug fix: in pexpr.c:p_factor:MK_SPECIAL case: Checked mp->isfunction.
  873. X   Symptom: Passing a built-in like PAGE as a procedure parameter failed.
  874. X
  875. X * Bug fix: in pexpr.c:p_setfactor: Moved "val.i|=1<<first[i]->val.i" to ELSE.
  876. X   Symptom: The set constant [3..0] generated 0x8, not 0.
  877. X
  878. X * Bug fix: in p2clib.c:P_addsetr: Added "v1 > v2" test.
  879. X   Symptom: The set constructor [i..j] did not generate [] when i > j.
  880. X
  881. X * Bug fix: in p2clib.c:P_peek: Return ' ' if character was \n.
  882. X   Symptom: Line breaks were sometimes not converted to space on input.
  883. X
  884. X * Bug fix: in p2c.h: Added "#define CPUTFBUF(f,v) (PUTFBUF(f,char,v))".
  885. X   Symptom: Calls to this undefined routine were produced.
  886. X
  887. X * Bug fix: in parse.c:p_stmt:TOK_FOR clause: Added checks for limit=MAXINT.
  888. X   Symptom: "for i := j to maxint" generated an infinite loop.
  889. X
  890. X * Bug fix: in decl.c:outfieldlist: Added checking for empty unions.
  891. X   Symptom: "record case integer of 1: () end" produced an empty C union.
  892. X
  893. X * Added to sys.p2crc/trans.h the following configuration parameters:
  894. X
  895. X    ArrayGetName      Analogous to GetName for "file of array" types.
  896. X    ArrayGetFBufName  Analogous to GetFBufName for "file of array" types.
  897. X    ArrayPutName      Analogous to PutName for "file of array" types.
  898. X    ArrayPutFBufName  Analogous to PutFBufName for "file of array" types.
  899. X
  900. XVersion 1.06:
  901. X
  902. X * Changed Makefile to look for ranlib in /bin, too.
  903. X
  904. X * Added ability to call dispose on a non-lvalue: clearing to NIL is omitted.
  905. X
  906. X * Added ForEvalOrder option: "in for x := y to z, y is evaluated before z".
  907. X
  908. X * Added more entries in the AvoidName and AvoidGlobalName lists.
  909. X
  910. X * Added checks for "__unix" cpp symbol synonymous with "unix".
  911. X
  912. X * Improved heuristic in arraysize() which returns NULL for "huge" arrays.
  913. X
  914. X * Added support for "rewrite(f)" creating an unnamed temporary file.
  915. X
  916. X * Added definition of "tmpfile" in p2c.h for systems that don't have it.
  917. X
  918. X * Bug fix in parse.c:usebraces: Added "sp != NULL &&" before findcomment.
  919. X   Symptom: Segmentation fault.
  920. X
  921. X * Bug fix in pexpr.c:dots_n_hats: Added "tp->basetype->fbase &&".
  922. X   Symptom: Segmentation fault.
  923. X
  924. X * Bug fix in parse.c:p_stmt:TOK_CASE clause: Changed to use p_ord_expr().
  925. X   Symptom: case 'A' of ... translated to switch("A"), not switch('A').
  926. X
  927. X * Bug fix in parse.c:p_stmt:TOK_FOR clause: Added tp_boolean to "small" types
  928. X   Symptom: for b := true downto false had unsigned-wraparound problems.
  929. X
  930. X * Bug fix in decl.c:outbasetype:TK_ENUM clause: Added test for mp == NULL.
  931. X   Symptom: Segmentation fault if null enum list.
  932. X
  933. X * Bug fix in expr.c:makeexpr_plus: a->nargs < 1: used gentle_cast on zero.
  934. X   Symptom: f(a-a) => "f()"; argument was converted to real const w/null value.
  935. X
  936. X * Bug fix in expr.c:makeexpr_plus: checked a->args[j] for TK_REAL/STRING, too.
  937. X   Symptom: 1+2.0 was incorrectly constant-folded, though 1.0+2 was correct.
  938. X
  939. X * Bug fix in p2c.h: removed trailing semicolon from FILEBUF definition.
  940. X
  941. X * Bug fix in decl.c:p_type: added a call to makefakestruct for TOK_FILEs.
  942. X   Symptom: "var f:file of record ... end" (for buffered f) produced bad code.
  943. X
  944. X * Added to sys.p2crc/trans.h the following configuration parameters:
  945. X
  946. X    ForEvalOrder    Initial value in for loop must be evaluated before limit.
  947. X    FreeRvalueName  Name of a function or macro to free a pointer in an rvalue.
  948. X
  949. XVersion 1.05:
  950. X
  951. X * Added support for reading packed arrays of characters.
  952. X
  953. X * Made some changes for compatibility with Xenix.
  954. X
  955. X * Put in slightly better handling of the "#define BSD" stuff.
  956. X
  957. X * Changed trans.c to avoid declaring sbrk() itself.
  958. X
  959. X * Changed p2c.h to define _toupper(), _tolower() in a non-ASCII-dependent way.
  960. X
  961. XVersion 1.04:
  962. X
  963. X * Added "-V" switch to generate a log file with some details of translation.
  964. X
  965. X * Added "-M" switch to control memory usage during translation.
  966. X
  967. X * Added "TEST_MALLOC" stuff to measure memory allocated but never freed.
  968. X
  969. X * Added {SIGNED} and {UNSIGNED} comments preceding type "char" and "integer".
  970. X
  971. X * Added HighCharBits-related optimizations for characters 128 and above.
  972. X
  973. X * Eliminated unnecessary casting of CHR's argument by making it MK_SPECIAL.
  974. X
  975. X * Recognized "ch+'A'-'a'" idiom and translated as "_toupper(ch)".
  976. X
  977. X * Added P2CRC environment variable.
  978. X
  979. X * Bug fix in parse.c:p_search: emptied curcomments at top of do loop.
  980. X   Symptom: leading comment in module header was copied over by import.
  981. X
  982. X * Bug fix in funcs.c:func_addr and elsewhere: fixed handling of procedure ptrs
  983. X   Symptom: "var pr:procedure; p := addr(pr);" wrote "_PROCEDURE pr; p = pr".
  984. X
  985. X * Bug fix in expr.c:makeexpr_assign: no longer copy _PROCEDUREs with memcpy.
  986. X   Symptom: memcpy was used to copy _PROCEDUREs even though assignable.
  987. X
  988. X * Bug fix in pexpr.c:p_factor: always allow makeexpr_hat after p_funccall
  989. X   Symptom: FuncMacros for string functions produced expression of wrong type
  990. X
  991. X * Bug fix in decl.c:p_conststring: added gettok() just before p_expr.
  992. X   Symptom: String constants with constructor notation didn't work.
  993. X
  994. X * Bug fix in decl.c:isfilevar and elsewhere: don't assume EK_DOT's val.i != 0.
  995. X   Symptom: Reference to NULL arises from "literal" dot expressions.
  996. X
  997. X * Bug fix in expr.c:value_name: check for value in range for "'%ld'" format.
  998. X   Symptom: Char literals containing negative or nonprinting chars were made.
  999. X
  1000. X * Bug fix in expr.c:type_sizeof: prevent multiple recursion for TK_ENUM types.
  1001. X   Symptom: Infinite recursion occurred when convert_size used on enum types.
  1002. X
  1003. X * Bug fix in expr.c:makeexpr_assign: avoid using memcpy for _PROCEDURE types.
  1004. X   Symptom: Procedure vars with static links used memcpy even if CopyStructs>0.
  1005. X
  1006. X * Added to sys.p2crc/trans.h the following configuration parameters:
  1007. X
  1008. X    HighCharBits    Do high-char optimizations (safest if chars are 8 bits).
  1009. X    PascalEnumSize  Size in bits of an enumerated type in Pascal.
  1010. X
  1011. XVersion 1.03:
  1012. X
  1013. X * Modified headers to compile under pure System V.
  1014. X
  1015. X * Added '::' operator in C expressions (e.g., FuncMacro definitions).
  1016. X
  1017. X * Added '##' comment delimiter to embedded configuration parameter comments.
  1018. X
  1019. X * In Turbo, RESET/REWRITE now open in read/write mode for binary files.
  1020. X
  1021. X * Added note/warning IDs and a mechanism for suppressing undesired notes.
  1022. X
  1023. X * Extended FuncMacros to apply to predefined and undeclared functions.
  1024. X
  1025. X * Added to sys.p2crc/trans.h the following configuration parameters:
  1026. X
  1027. X    ReadWriteOpen   Binary files always opened in read/write mode.
  1028. X    EatNotes        List of notes/warnings to be suppressed.
  1029. X
  1030. XVersion 1.02:
  1031. X
  1032. X * Added support for HP Pascal with HP-UX 6.2 and 6.5:
  1033. X     BADDRESS, WADDRESS, ADDTOPOINTER, BITSIZE, FCALL.
  1034. X
  1035. X * Now initializes file variables embedded in records or allocated by NEW.
  1036. X
  1037. X * Better error messages in skipcomma, skipcloseparen.
  1038. X
  1039. X * Extended convert_offset in funcs.c to handle more cases.
  1040. X
  1041. X * Extended distribute_plus in expr.c to handle negated arguments.
  1042. X
  1043. X * Line breaker's behavior in difficult/large cases is improved.
  1044. X
  1045. X * Bug fix in decl.c:setup_decl: changed '... modula2 ? "WORD" : "UWORD"'
  1046. X   to '... modula2 ? "UWORD" : "WORD"'
  1047. X   Symptom:  Turbo did not recognize "WORD" built-in type any more.
  1048. X
  1049. X * Bug fix in funcs.c:func_random: removed incorrect "->args[0]" after "ex".
  1050. X   Symptom:  Bus error parsing "random(4)".
  1051. X
  1052. X * Bug fix in funcs.c: decl_builtins: "randomize" function declared.
  1053. X   Symptom:  Turbo Pascal "randomize" not recognized.
  1054. X
  1055. X * Bug fix in funcs.c: blockread & blockwrite: size and nitems args swapped.
  1056. X   Symptom:  Return value for blockread & blockwrite was wrong.
  1057. X
  1058. X * Bug fix in p2clib.c:P_inset: condition changed to "val < *s++ ..."
  1059. X   Symptom:  Certain elements appeared to be in the set even though too large.
  1060. X
  1061. X * Bug fix in funcs.c:handleopen: called makeexpr_stringify for file name.
  1062. X   Symptom:  Reset lost file name in dialects with only packed arrays of char.
  1063. X
  1064. X * Bug fix in decl.c:declaretype: added declaresubtypes function.
  1065. X   Symptom:  _REC_xxx records sometimes emitted before the things they used.
  1066. X
  1067. X * Bug fix in expr.c:makeexpr_lstring, etc: added null terminator for strings.
  1068. X   Symptom:  Occasional spurious treatment of string constants.
  1069. X
  1070. X * Bug fix in parse.c:replaceexprexpr: now even less strict about types.
  1071. X   Symptom:  If had to replace char variable ch, missed ord(ch) usage.
  1072. X
  1073. X * Bug fix in out.c:adddeltas/applydelta: changed "> 1000" to ">= 1000".
  1074. X   Symptom:  Absolute indention of 0 did not work properly.
  1075. X
  1076. XVersion 1.01:
  1077. X
  1078. X * VAX Pascal support added.
  1079. X
  1080. X * UCSD Pascal support added.
  1081. X
  1082. X * MPW Pascal support added.
  1083. X
  1084. X * Partial Modula-2 support added.
  1085. X
  1086. X * Added -L command-line flag.
  1087. X
  1088. X * Support for non-local GOTO's added.
  1089. X
  1090. X * Improved code generation for certain set operations.
  1091. X
  1092. X * Special comment forms now recognized for (* *) as well as { }.
  1093. X
  1094. X * Added the "Synonym" feature.
  1095. X
  1096. X * Removed unnecessary type casts for ANYVAR parameters and FuncMacros.
  1097. X
  1098. X * Added comments in trans.h describing major p2c data structures.
  1099. X
  1100. X * Bug fix in parse.c:checkcommas: "if (sp->exp1)" added in SK_FOR case.
  1101. X   Symptom:  Bus error when initializer portion of FOR was null.
  1102. X
  1103. X * Bug fix in trans.c:main: setup_comment now called before setup_lex.
  1104. X   Symptom:  Initial comment in program disappeared.
  1105. X
  1106. X * Bug fix in pexpr.c:p_funccall: added func_reference function.
  1107. X   Symptom:  Static links were occasionally left out when they were needed.
  1108. X
  1109. X * Bug fix in funcs.c:decl_builtins: "pi" function declared.
  1110. X   Symptom:  Turbo Pascal "pi" not recognized since func_pi never called.
  1111. X
  1112. X * Bug fix in decl.c:outdeclarator and elsewhere: improved pointers to arrays.
  1113. X   Symptom:  An array-of-strings parameter was declared as "char **".
  1114. X
  1115. X * Bug fix in system.imp: Turbo Pascal's "getmem" was incorrectly declared.
  1116. X
  1117. X * Added to sys.p2crc/trans.h the following configuration parameters:
  1118. X
  1119. X    Modula2        Use Modula-2 instead of Pascal syntax.
  1120. X    ImplModules        Modules use VAX notation rather than HP/UCSD notation.
  1121. X    IgnoreNonAlpha  Ignore non-alphanumeric characters in Pascal identifiers.
  1122. X    StarArrays        Control notation for array-valued parameters.
  1123. X    InitialCalls    List of functions to call at start of main program.
  1124. X    SymbolFormat    Format string for C identifiers derived from Pascal ones.
  1125. X    ArrayMinName    Name for lower-bound variables (Modula-2/VAX Pascal).
  1126. X    ArrayMaxName    Name for upper-bound variables (Modula-2/VAX Pascal).
  1127. X    LabelVarName    Name for jmp_buf variable associated with a stmt label.
  1128. X    Synonym        Declare a synonym for a Pascal keyword or identifier.
  1129. X    AvoidName        Added "Inline" to the list.
  1130. X    StructFunction  Added "P_remset" to the list.
  1131. X    StrlapFunction  Added "P_setxor" and "strpad" to the list.
  1132. X    RemName        Name of function or macro for VAX Pascal REM operator.
  1133. X    StrPadName        Name of function for VAX Pascal "pad" function.
  1134. X    SetXorName        Name of function for symmetrical set difference.
  1135. X    SetRemName        Name of function to remove an element from a set.
  1136. X
  1137. XVersion 1.00:
  1138. X
  1139. X(Initial public release)
  1140. END_OF_FILE
  1141. if test 17901 -ne `wc -c <'src/HISTORY'`; then
  1142.     echo shar: \"'src/HISTORY'\" unpacked with wrong size!
  1143. fi
  1144. # end of 'src/HISTORY'
  1145. fi
  1146. echo shar: End of archive 7 \(of 32\).
  1147. cp /dev/null ark7isdone
  1148. MISSING=""
  1149. 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
  1150.     if test ! -f ark${I}isdone ; then
  1151.     MISSING="${MISSING} ${I}"
  1152.     fi
  1153. done
  1154. if test "${MISSING}" = "" ; then
  1155.     echo You have unpacked all 32 archives.
  1156.     echo "Now see PACKNOTES and the README"
  1157.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1158. else
  1159.     echo You still need to unpack the following archives:
  1160.     echo "        " ${MISSING}
  1161. fi
  1162. ##  End of shell archive.
  1163. exit 0
  1164.