🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: comp.lang.modula2
Article #2043

Re: Modula-2 Dhrystone?

#2043
From: Peter Funk
Date: Thu, 02 May 1991 15:03
364 lines
8158 bytes
In <22000001@inmet> daf@inmet.inmet.com writes:
> Does anyone know if the Dhrystone benchmark has been translated into
> Modula-2?  If so, could you point me towards a copy of the source?
see below.

Regards, Peter
-=-=-
Peter Funk \\ ArtCom GmbH, Schwachhauser Heerstr. 78, D-2800 Bremen 1
Work at home: Oldenburger Str.86, D-2875 Ganderkesee 1/+49 4222 6018 (8am-6pm)
---
MODULE DHRYSTONE;

  FROM Storage IMPORT ALLOCATE;
  FROM SYSTEM  IMPORT TSIZE;

  FROM Strings           IMPORT Assign, Insert, Delete, Pos, Copy, Concat,
                                Length, CompareStr;




  CONST
    Null = 0;
    Ident1 = 1;
    Ident2 = 2;
    Ident3 = 3;
    Ident4 = 4;
    Ident5 = 5;



  TYPE
    strings = ARRAY [0..30-1] OF CHAR;
    intar51 = ARRAY [0..50] OF INTEGER;
    intar5151 = ARRAY [0..50] OF intar51;

    strptr = POINTER TO structure;
    structure = RECORD
                  ptrcomp: strptr;
                  discr, enumcomp, intcomp: INTEGER;
                  stringcomp: strings;
                END;



  VAR
    records: ARRAY [0..2] OF structure;

    array1: intar51;
    array2: intar5151;

    intglob: INTEGER;
    boolglob: BOOLEAN;
    char1glob, char2glob: CHAR;
    string1loc: strings;
    ptrglb, ptrglbnext: strptr;


  PROCEDURE Func1(charpar1, charpar2: CHAR): INTEGER;

    VAR
      charloc1, charloc2: INTEGER;
    VAR Func1Result: INTEGER;
  BEGIN
    charloc1 := ORD(charpar1);
    charloc2 := charloc1;
    IF (* true *)
    charloc2 <> charloc2 THEN

      Func1Result := Ident2
    ELSE
      Func1Result := Ident1
    END;
    RETURN Func1Result
  END Func1;

  (* once *)

  PROCEDURE Func2(strpari1, strpari2: strings): BOOLEAN;

    PROCEDURE Strcmp(s1, s2: strings): INTEGER;

      VAR
        i, k: INTEGER;
      VAR StrcmpResult: INTEGER;
    BEGIN
      i := 1;
      StrcmpResult := 0;
      k := Length(s1);
      IF Length(s1) > Length(s2) THEN
        k := Length(s2);
        StrcmpResult := 1
      ELSIF Length(s1) = Length(s2) THEN

        StrcmpResult := 0
      ELSE
        StrcmpResult := (-1)
      END;
      WHILE (s1[i] = s2[i]) AND (i <= k) DO
        i := VAL(INTEGER, ORD(i)+1)
      END;
      IF i <= k THEN
        IF s1[i] = s2[i] THEN

          StrcmpResult := 0
        ELSIF s1[i] > s2[i] THEN
          StrcmpResult := 1
        ELSE
          StrcmpResult := (-1)
        END
      END;
      RETURN StrcmpResult
    END Strcmp;


    VAR
      intloc: INTEGER;
      charloc: CHAR;
    VAR Func2Result: BOOLEAN;
  BEGIN
    intloc := 1;
    WHILE intloc <= 1 DO
      (* once *) ;
      IF Func1(strpari1[intloc], strpari2[intloc+1]) = Ident1 THEN

        charloc := 'A';
        intloc := VAL(INTEGER, ORD(intloc)+1);

      END
    END;
    IF (charloc >= 'W') AND (charloc <= 'Z') THEN
      intloc := 7;
    END;
    IF charloc = 'X' THEN
      Func2Result := TRUE;

    ELSIF Strcmp(strpari1, strpari2) > 0 THEN

      INC(intloc, 7);
      Func2Result := TRUE;

    ELSE
      Func2Result := FALSE
    END;
    RETURN Func2Result
  END Func2;


  PROCEDURE Func3(enumparin: INTEGER): BOOLEAN;

    VAR
      enumloc: INTEGER;
    VAR Func3Result: BOOLEAN;
  BEGIN
    enumloc := enumparin;
    Func3Result := enumloc = Ident3;
    RETURN Func3Result
  END Func3;






  (* once *)

  PROCEDURE P8(array1par: intar51;
               array2par: intar5151;
               intpari1, intpari2: INTEGER);

    VAR
      intloc, intindex: INTEGER;
  BEGIN
  (* intpari1=3;   intpari2 = 7 *)
    intloc := intpari1+5;
    array1par[intloc] := intpari2;
    array1par[intloc+1] := array1par[intloc];
    array1par[intloc+30] := intloc;
    FOR intindex := intloc TO 2 BY -1 DO
      array2par[intloc][intindex] := intloc
    END;
    array2par[intloc][intloc-1] := array2par[intloc][intloc-1]+1;
    array2par[intloc+20][intloc] := array1par[intloc];
    intglob := 5;
  END P8;



  PROCEDURE P7(intpari1, intpari2: INTEGER;
               VAR intparout: INTEGER);

    VAR
      intloc: INTEGER;
  BEGIN
    intloc := intpari1+2;
    intparout := intpari2+intloc;
  END P7;




  PROCEDURE P5;
  BEGIN
    char1glob := 'A';
    boolglob := FALSE;
  END P5;


  PROCEDURE P4;

    VAR
      boolloc: BOOLEAN;
  BEGIN
    boolloc := char1glob = 'A';
    boolloc := boolloc OR boolglob;
    char2glob := 'B';
  END P4;

  (* once *)

  PROCEDURE P3(VAR ptrparout: strptr);
  BEGIN
    IF ptrglb <> NIL THEN
      (* true *)
      ptrparout := ptrglb^.ptrcomp
    ELSE
      intglob := 100
    END;
    P7(10, intglob, ptrglb^.intcomp);
  END P3;

  (* once *)

  PROCEDURE P6(enumparin: INTEGER;
               VAR enumparout: INTEGER);

    VAR
      res: BOOLEAN;
  BEGIN
    enumparout := enumparin;
    IF  NOT Func3(enumparin) THEN
      enumparout := Ident4
    END; (* not taken *)
    CASE enumparin OF
        Ident1:
        enumparout := Ident1
      | Ident2:
        IF intglob > 100 THEN

          enumparout := Ident1
        ELSE
          enumparout := Ident4
        END
      | Ident3:
        enumparout := Ident2
      | Ident4:
      | Ident5:
        enumparout := Ident3

      ELSE
    END;
  END P6;


  PROCEDURE P2(VAR intpario: INTEGER);

    VAR
      intloc, enumloc: INTEGER;
      going: BOOLEAN;
  BEGIN
  (* intpario = 3 *)
    intloc := intpario+10;
    going := TRUE;
    WHILE going DO
      (* once *)
      IF char1glob = 'A' THEN

        intloc := VAL(INTEGER, ORD(intloc)-1);
        intpario := intloc-intglob;
        enumloc := Ident1;
      END;
      going := enumloc <> Ident1;
    END;
  END P2;


  PROCEDURE P1(ptrparin: strptr);
  BEGIN
    WITH ptrglb^ DO

      ptrparin^.intcomp := 5;
      intcomp := ptrparin^.intcomp;
      ptrcomp := ptrparin^.ptrcomp;
      P3(ptrcomp);
      IF discr = Ident1 THEN
        (* true *)
        intcomp := 6;
        P6(ptrparin^.enumcomp, enumcomp);
        ptrcomp := ptrglb^.ptrcomp;
        P7(intcomp, 10, intcomp);

      ELSE
        ptrparin^ := ptrglb^.ptrcomp^
      END;
    END;
  END P1;


  PROCEDURE P0(loops: INTEGER);

    VAR
      string2loc: strings;
      intloc1, intloc2, intloc3: INTEGER;
      charindex, charloc: CHAR;
      i, enumloc: INTEGER;

  BEGIN
    FOR i := 1 TO loops DO

      P5;
      P4;
      intloc1 := 2;
      intloc2 := 3;
      string2loc := "DHRYSTONE PROGRAM, 2'nd STRING";
      enumloc := Ident2;
      boolglob :=  NOT Func2(string1loc, string2loc); (*true *)
      WHILE intloc1 < intloc2 DO
        (* 1 *)
        intloc3 := (5*intloc1)-intloc2;
        P7(intloc1, intloc2, intloc3);
        intloc1 := VAL(INTEGER, ORD(intloc1)+1);
      END;
      P8(array1, array2, intloc1, intloc3); (* intglob=5 *)
      P1(ptrglb);
      FOR charindex := 'A' TO char2glob DO (* 2 *)
        IF enumloc = Func1(charindex, 'C') THEN
          P6(Ident1, enumloc)
        END
      END; (* enumloc=ident1  intloc1=3  intloc2=3 intloc3=7 *)
      intloc3 := intloc2*intloc1;
      intloc2 := intloc3 DIV intloc1;
      intloc2 := (7*(intloc3-intloc2))-intloc1;
      P2(intloc1);
    END;
  END P0;


  VAR
    count, i: INTEGER;

BEGIN
  ALLOCATE(ptrglb,TSIZE(structure));
  WITH ptrglb^ DO

    ALLOCATE(ptrcomp,TSIZE(structure));
    discr := Ident1;
    enumcomp := Ident3;
    intcomp := 40;
    stringcomp := 'DHRYSTONE PROGRAM, SOME STRING';
  END;
  string1loc := "DHRYSTONE PROGRAM, 1'ST STRING";
  count := 1000;
  P0(count);
END DHRYSTONE.
Technical Details
Message-ID: <3192@artcom0.north.de>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!rpi!crdgw1!uakari.primate.wisc.edu!caen!sol.ctr.columbia.edu!ira.uka.de!smurf!artcom0!pf
References: <22000001@inmet>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!news-server.csri.toronto.edu!rpi!crdgw1!uakari.primate.wisc.edu!caen!sol.ctr.columbia.edu!ira.uka.de!smurf!artcom0!pf
From: pf@artcom0.north.de (Peter Funk)
Newsgroups: comp.lang.modula2
Subject: Re: Modula-2 Dhrystone?
Message-ID: <3192@artcom0.north.de>
Date: 2 May 91 15:03:24 GMT
References: <22000001@inmet>
Organization: ArtCom GmbH, Atelier f. Computergrafik, Bremen(FRG)
Lines: 364