home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / xc212os2.zip / SAMPLES / SIMPLE / dry.mod < prev    next >
Text File  |  1996-01-06  |  8KB  |  266 lines

  1. <*# IF __GEN_X86__ THEN *>
  2.   <*+NOPTRALIAS*>
  3.   <*-SPACE*>
  4.   <*-GENHISTORY*>
  5. <*# END *>
  6. <*+M2EXTENSIONS*>
  7. <*+ALIGNMENT*>
  8. <*+PROCINLINE*>
  9. <*-CHECKINDEX*>
  10. <*-CHECKRANGE*>
  11. <*-CHECKNIL*>
  12. <*-IOVERFLOW*>
  13. <*-COVERFLOW*>
  14. <*-GENDEBUG*>
  15. <*-LINENO*>
  16.  
  17. MODULE Dry;
  18.  
  19. IMPORT InOut, SysClock;
  20. FROM Storage IMPORT ALLOCATE;
  21.  
  22. CONST   LOOPS = 4000000;
  23.  
  24. TYPE Enumeration    = (Ident1, Ident2, Ident3, Ident4, Ident5);
  25.      OneToThirty    = INTEGER [1..30];
  26.      OneToFifty     = INTEGER [1..50];
  27.      CapitalLetter  = ['A'..'Z'];
  28.      String30       = ARRAY [0..30] OF CHAR;
  29.      Array1Dim      = ARRAY [0..50] OF INTEGER;
  30.      Array2Dim      = ARRAY [0..50], [0..50] OF INTEGER;
  31.      RecordPtr      = POINTER TO RecordType;
  32.      RecordType     = RECORD
  33.                         PtrComp : RecordPtr;
  34.                         Discr : Enumeration;
  35.                         EnumComp : Enumeration;
  36.                         IntComp : OneToFifty;
  37.                         StringComp : String30;
  38.                       END;
  39.  
  40. VAR clocks, clocks0       : INTEGER;
  41.     IntGlob               : INTEGER;
  42.     BoolGlob              : BOOLEAN;
  43.     Char1Glob, Char2Glob  : CHAR;
  44.     Array1Glob            : Array1Dim;
  45.     Array2Glob            : Array2Dim;
  46.     PtrGlob, PGlobNext    : RecordPtr;
  47.  
  48. PROCEDURE time (VAR tm: INTEGER);       (* Get time - IGNORE MIDNIGHT! *)
  49. VAR t: SysClock.DateTime;
  50. BEGIN
  51.     SysClock.GetClock (t);
  52.     tm := (t.hour * 60 + t.minute) * 60 + t.second;
  53. END time;
  54.  
  55. PROCEDURE Func1 (CharPar1, CharPar2 : CapitalLetter) : Enumeration; FORWARD;
  56. PROCEDURE Func2 (VAR StrParI1, StrParI2 : String30) : BOOLEAN; FORWARD;
  57. PROCEDURE Func3 (EnumParIn : Enumeration) : BOOLEAN; FORWARD;
  58. PROCEDURE Proc3 (VAR PtrParOut : RecordPtr); FORWARD;
  59. PROCEDURE Proc6 (EnumParIn : Enumeration; VAR EnumParOut : Enumeration); FORWARD;
  60. PROCEDURE Proc7 (IntParI1, IntParI2 : OneToFifty; VAR IntParOut : OneToFifty); FORWARD;
  61.  
  62. PROCEDURE Proc1 (PtrParIn : RecordPtr);
  63. BEGIN
  64.       PtrParIn^.PtrComp^ := PtrGlob^;
  65.       PtrParIn^.IntComp := 5;
  66.       PtrParIn^.PtrComp^.IntComp := PtrParIn ^. IntComp;
  67.       PtrParIn^.PtrComp^.PtrComp := PtrParIn ^. PtrComp;
  68.       Proc3 (PtrParIn^.PtrComp^.PtrComp);
  69.       IF PtrParIn^.PtrComp^.Discr = Ident1 THEN
  70.          PtrParIn^.PtrComp^.IntComp := 6;
  71.          Proc6 (PtrParIn ^. EnumComp, PtrParIn^.PtrComp^.EnumComp);
  72.          PtrParIn^.PtrComp^.PtrComp := PtrGlob ^. PtrComp;
  73.          Proc7 (PtrParIn^.PtrComp^.IntComp, 10, PtrParIn^.PtrComp^.IntComp);
  74.       ELSE
  75.          PtrParIn^ := PtrParIn^.PtrComp^;
  76.       END;
  77. END Proc1;
  78.  
  79. PROCEDURE Proc2 (VAR IntParIO : OneToFifty);
  80. VAR IntLoc:OneToFifty;
  81. VAR EnumLoc:Enumeration;
  82. BEGIN
  83.       IntLoc := IntParIO + 10;
  84.       LOOP
  85.          IF Char1Glob = 'A' THEN
  86.             DEC (IntLoc); IntParIO := IntLoc - IntGlob; EnumLoc := Ident1;
  87.          END;
  88.          IF EnumLoc = Ident1 THEN EXIT END;
  89.       END
  90. END Proc2;
  91.  
  92. PROCEDURE Proc3 (VAR PtrParOut : RecordPtr);
  93. BEGIN
  94.         IF PtrGlob # NIL THEN
  95.             PtrParOut := PtrGlob^.PtrComp;
  96.         ELSE
  97.             IntGlob := 100;
  98.         END;
  99.         Proc7 (10, IntGlob, PtrGlob^.IntComp);
  100. END Proc3;
  101.  
  102. PROCEDURE Proc4;
  103. VAR BoolLoc:BOOLEAN;
  104. BEGIN
  105.       BoolLoc := Char1Glob = 'A';
  106.       BoolLoc := BoolLoc OR BoolGlob;
  107.       Char2Glob := 'B';
  108. END Proc4;
  109.  
  110. PROCEDURE Proc5;
  111. BEGIN
  112.       Char1Glob := 'A'; BoolGlob := FALSE;
  113. END Proc5;
  114.  
  115. PROCEDURE Proc6 (EnumParIn : Enumeration; VAR EnumParOut : Enumeration);
  116. BEGIN
  117.       EnumParOut := EnumParIn;
  118.       IF NOT Func3 (EnumParIn) THEN
  119.          EnumParOut := Ident4;
  120.       END;
  121.       CASE EnumParIn OF
  122.       |  Ident1:      EnumParOut := Ident1;
  123.       |  Ident2:      IF IntGlob > 100 THEN
  124.                          EnumParOut := Ident1;
  125.                       ELSE
  126.                          EnumParOut := Ident4;
  127.                       END;
  128.       |  Ident3:      EnumParOut := Ident2;
  129.       |  Ident4:
  130.       |  Ident5:      EnumParOut := Ident3;
  131.       END;
  132. END Proc6;
  133.  
  134. PROCEDURE Proc7 (IntParI1, IntParI2 : OneToFifty; VAR IntParOut : OneToFifty);
  135. VAR IntLoc:OneToFifty;
  136. BEGIN
  137.         IntLoc := IntParI1 + 2;
  138.         IntParOut := IntParI2 + IntLoc;
  139. END Proc7;
  140.  
  141. PROCEDURE Proc8 (VAR Array1Par : Array1Dim; VAR Array2Par : Array2Dim;
  142.                  IntParI1, IntParI2 : OneToFifty);
  143. VAR IntLoc, IntIndex:OneToFifty;
  144. BEGIN
  145.         IntLoc := IntParI1 + 5;
  146.         Array1Par [IntLoc] := IntParI2;
  147.         Array1Par [IntLoc + 1] := Array1Par [IntLoc];
  148.         Array1Par [IntLoc + 30] := IntLoc;
  149.         FOR IntIndex := IntLoc TO IntLoc + 1 DO
  150.                 INC (Array2Par [IntLoc] [IntLoc - 1]);
  151.         END;
  152.         Array2Par [IntLoc + 20] [IntLoc] := Array1Par [IntLoc];
  153.         IntGlob := 5;
  154. END Proc8;
  155.  
  156. PROCEDURE Func1 (CharPar1, CharPar2 : CapitalLetter) : Enumeration;
  157. VAR CharLoc1,CharLoc2:CapitalLetter;
  158. BEGIN
  159.       CharLoc1 := CharPar1;
  160.       CharLoc2 := CharLoc1;
  161.       IF CharLoc2 # CharPar2 THEN RETURN Ident1 ELSE RETURN Ident2 END;
  162. END Func1;
  163.  
  164. PROCEDURE Func2 (VAR StrParI1, StrParI2 : String30) : BOOLEAN;
  165. VAR IntLoc:OneToThirty;
  166. VAR CharLoc:CapitalLetter;
  167. BEGIN
  168.       IntLoc := 1;
  169.       WHILE IntLoc <= 1 DO
  170.          IF Func1 (StrParI1 [IntLoc], StrParI2 [IntLoc + 1]) = Ident1 THEN
  171.             CharLoc := 'A'; INC (IntLoc);
  172.          END;
  173.       END;
  174.       IF (CharLoc >= 'W') AND (CharLoc <= 'Z') THEN
  175.          IntLoc := 7;
  176.       END;
  177.       IF CharLoc = 'X' THEN
  178.          RETURN TRUE;
  179.       ELSE
  180.          IF StrParI1 > StrParI2 THEN
  181.             INC (IntLoc, 7);
  182.             RETURN TRUE;
  183.          ELSE
  184.             RETURN FALSE;
  185.          END;
  186.       END
  187. END Func2;
  188.  
  189. PROCEDURE Func3 (EnumParIn : Enumeration) : BOOLEAN;
  190. VAR EnumLoc:Enumeration;
  191. BEGIN
  192.         EnumLoc := EnumParIn;
  193.         IF EnumLoc = Ident3 THEN
  194.                 RETURN TRUE;
  195.         END;
  196.         RETURN FALSE;
  197. END Func3;
  198.  
  199. PROCEDURE Proc0;
  200.         VAR IntLoc1, IntLoc2, IntLoc3 : OneToFifty;
  201.             CharLoc, CharIndex : CHAR;
  202.             EnumLoc : Enumeration;
  203.             String1Loc, String2Loc : String30;
  204.             starttime, benchtime, nulltime, totaltime : INTEGER;
  205.             i : INTEGER;
  206. BEGIN
  207.         InOut.WriteString ("Please, wait about 60 seconds");
  208.         InOut.WriteLn;
  209.         time (starttime);
  210.         FOR i := 1 TO LOOPS DO
  211.         END;
  212.         time (benchtime);
  213.         nulltime := benchtime - starttime;
  214.  
  215.         ALLOCATE  (PGlobNext, SIZE (PGlobNext^));
  216.         ALLOCATE  (PtrGlob,   SIZE (PtrGlob^));
  217.         PtrGlob ^. PtrComp  := PGlobNext;
  218.         PtrGlob ^. Discr    := Ident1;
  219.         PtrGlob ^. EnumComp := Ident3;
  220.         PtrGlob ^. IntComp  := 40;
  221.         PtrGlob ^. StringComp := "DHRYSTONE PROGRAM, SOME STRING";
  222.         String1Loc := "DHRYSTONE PROGRAM, 1'ST STRING";
  223.         time (starttime);
  224.  
  225.         FOR i := 1 TO LOOPS DO
  226.             Proc5;
  227.             Proc4;
  228.             IntLoc1    := 2;
  229.             IntLoc2    := 3;
  230.             String2Loc := "DHRYSTONE PROGRAM, 2'ND STRING";
  231.             EnumLoc    := Ident2;
  232.             BoolGlob   := NOT Func2 (String1Loc, String2Loc);
  233.             WHILE IntLoc1 < IntLoc2 DO
  234.                IntLoc3 := 5 * IntLoc1 - IntLoc2;
  235.                Proc7 (IntLoc1, IntLoc2, IntLoc3);
  236.                INC (IntLoc1);
  237.            END;
  238.            Proc8 (Array1Glob, Array2Glob, IntLoc1, IntLoc3);
  239.            Proc1 (PtrGlob);
  240.            FOR CharIndex := 'A' TO Char2Glob DO
  241.                IF EnumLoc = Func1 (CharIndex, 'C') THEN
  242.                   Proc6 (Ident1, EnumLoc);
  243.                END;
  244.            END;
  245.            IntLoc3 := IntLoc2 * IntLoc1;
  246.            IntLoc2 := IntLoc3 DIV IntLoc1;
  247.            IntLoc2 := 7 * (IntLoc3 - IntLoc2) - IntLoc1;
  248.            Proc2 (IntLoc1);
  249.         END;
  250.         time (benchtime);
  251.         totaltime := benchtime - starttime - nulltime;
  252.         InOut.WriteString ("Dhrystone time for");
  253.         InOut.WriteCard   (LOOPS, 0);
  254.         InOut.WriteString (" passes =");
  255.         InOut.WriteInt    (totaltime, 0);
  256.         InOut.WriteLn;
  257.         InOut.WriteString  ("This machine benchmarks at");
  258.         InOut.WriteInt     (LOOPS / totaltime, 0);
  259.         InOut.WriteString  (" dhrystones/second");
  260.         InOut.WriteLn;
  261. END Proc0;
  262.  
  263. BEGIN
  264.     Proc0;
  265. END Dry.
  266.