home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / c / tptc17tc.lzh / TEST.PAS < prev    next >
Pascal/Delphi Source File  |  1988-03-25  |  5KB  |  222 lines

  1.  
  2. (*
  3.  * This program demonstrates some weaknesses in TPC 1.4 and TPC 1.5.  Unless
  4.  * otherwise noted, all failed translations are in 1.4 and corrected in 1.5.
  5.  *
  6.  *)
  7.  
  8. program Test;
  9.  
  10. var
  11.    vector     : Integer absolute $0000:$03c4;
  12.                         (* absolute variables not translated in tpc 1.5 *)
  13.  
  14.    Ch         : Char;
  15.    IbmAt      : Boolean;
  16.    Control    : Boolean;
  17.  
  18. type
  19.   Longstring = string[255];
  20.  
  21.   Lookup = Array[1..7,0..1] of integer;
  22.                         (* multi-dimension array declarations not translated
  23.                            in tpc 1.5 *)
  24.  
  25.   NestedArray = Array[1..7] of array[0..1] of integer;
  26.                         (* nested arrays not translated in tpc 1.5 *)
  27.  
  28.   mytype1 = char;
  29.   mytype2 = byte;
  30.   mytype3 = integer;
  31.   mytype4 = string[80];
  32.  
  33.   myrec = record
  34.      astr:  longstring;
  35.      areal: real;
  36.      aint:  integer;
  37.      achar: char;
  38.   end;
  39.   
  40. const
  41.   tab  : Lookup = { this goes haywire here      }
  42.                      ((10,824), (9,842), (9,858), (9,874),
  43.                       (10,890), (9,908), (9,924));
  44.  
  45. procedure InvVid(m:  longstring);       {added}
  46. begin
  47.    writeln(m);
  48. end;
  49.  
  50. procedure call_a;
  51. var
  52.    s1,s2: string;
  53. begin
  54.    s1 := 'filename';
  55.    s2 := '#include "' + s1 + '"  ';
  56. end;
  57.  
  58. procedure call_b(L     : Integer;
  59.                  table : Lookup);
  60. const
  61.    seg_addr = $0040;                    {constants added}
  62.    filter_ptr = $200;
  63.    Vert = '|';
  64.    Dbl = '==';
  65.  
  66. begin
  67.   Write(Memw[seg_addr : Filter_Ptr] + 1); GotoXY(4,4);
  68.   GotoXY(4,11);
  69.  
  70. { put this next line in blows up in 1.4 -- }
  71.           InvVid(Vert+' Retrieve '+Dbl+' Save '+Dbl+
  72.                      ' Combine '+Dbl+' Xtract '+Dbl+' Erase '+
  73.                      Dbl+' List '+Dbl+' Import '+Dbl+
  74.                      ' Directory '+ Vert);
  75. end;
  76.  
  77. procedure UsesUntyped( width: integer;
  78.                        var base; {untyped}
  79.                        size: integer );
  80. var
  81.    buf: array[1..1000] of byte absolute base;
  82.                      (* absolutes not translated in 1.6 *)
  83.    i: integer;
  84. begin
  85.    for i := 1 to size do 
  86.       writeln(i,': ',buf[i]:width);
  87. end;
  88.                                             
  89.    
  90. procedure myprocmess(var v1, v2, v3);
  91.          {untyped params not translated in tpc1.5}
  92. var 
  93.     xv1: mytype1 absolute v1;
  94.     xv2: mytype2 absolute v2;
  95.     xv3: mytype3 absolute v3;
  96.     xv4: mytype4 absolute v3;  (* this is the dirtiest of the lot *)
  97.                   {absolute variables not translated in tpc1.5}
  98.     othvar1: integer;
  99.     othvar2: char;
  100.     
  101. begin
  102.     othvar1 := xv1;
  103.     othvar2 := xv2;
  104.     othvar1 := xv3;
  105.     othvar2 := xv4;      
  106.                   {implicit conversion of absolute variables to
  107.                    pointer deref's produced by tptc1.6}
  108. end;
  109.  
  110. procedure varparams(var i: integer;
  111.                     var r: real;
  112.                     var s: string);
  113. begin
  114.    i := 100;
  115.    r := 100.1;
  116.    s := 'some string';
  117.    s[5] := '!';
  118. end;
  119.  
  120.                     
  121. procedure test_untyped;
  122. var
  123.    r: real;
  124.    i: integer;
  125.    s: string;
  126. begin
  127.    r := 1.2;
  128.    i := 99;
  129.    s := 'some string';
  130.    myprocmess(r,i,s);
  131.  
  132.    UsesUntyped( 10, s, 2);
  133.    UsesUntyped( 8, r, 3);
  134.    UsesUntyped( 2, i, 3);
  135.  
  136.    varparams(i,r,s);
  137.  
  138.    str(r:3:1,s);  {should generate sbld call}
  139.    val(s,r,i);    {should pass address of r and i}
  140. end;
  141.  
  142. procedure testrec;
  143. var
  144.    rec1: myrec;
  145.    rec2: myrec;
  146. const
  147.    limit = 1000;
  148. begin
  149.    rec1.astr := 'some string';
  150.    rec1.astr[5] := '-';
  151.    rec1.areal := 1.23;
  152.    rec1.achar := 'x';
  153.    rec1.aint := limit;
  154.    writeln('str=',rec1.astr,' r=',rec1.areal,' i=',rec1.aint,' c=',rec1.achar);
  155.    rec2 := rec1;
  156. end;
  157.  
  158. procedure test_nesting(outerpar: integer);
  159. const
  160.    limit = 2000;  {clashes with testrec's limit?}
  161. var
  162.    outervar: integer;
  163.  
  164.    procedure inner;
  165.       {outer version of inner}
  166.    
  167.       procedure inner;
  168.          {name will clash with outer version of inner}
  169.       begin
  170.          outervar := 1;
  171.          {inmost}
  172.       end;
  173.       
  174.    var
  175.       innervar: integer;
  176.    begin
  177.       inner; {outer version of inner}
  178.       innervar := outerpar;
  179.       outervar := innervar + limit;
  180.    end;
  181.  
  182. begin
  183.    inner;
  184.    outervar := outerpar;
  185.    write(^M^J'This wouldn''t translate in tpc1.5!');
  186.    write(^M^J'This wouldn''t translate in tpc1.5!'^M^J);
  187.    write('This wouldn''t translate in tpc1.5!'^M^J);
  188. end;
  189.  
  190. procedure main_block;  
  191. begin
  192.    if Mem[$ffff:$0e] = $FC then
  193.    begin
  194.      IbmAt := True;
  195.    end;
  196.  
  197.  Repeat
  198.    if IbmAt then
  199.      begin
  200.        Control := True;
  201.      end
  202.    else
  203.  
  204.    case Ch of
  205.       '1'..'8':     call_a;     { 1.4 fails to put in cases from 2 to 7 }
  206.       'Z' :         call_a;
  207.       'z' :         begin end;                { do nothing  }
  208.        else
  209.            { Do Nothing }
  210.       end;
  211.  
  212.    Until (Ch = Chr(13))  OR  (Ch = 'Z');
  213. end;
  214.  
  215.  
  216.  
  217. begin
  218.    (* main block *)
  219.    main_block;
  220. end.
  221.  
  222.