1"""
2"PYSTONE" Benchmark Program
3
4Version:        Python/1.2 (corresponds to C/1.1 plus 3 Pystone fixes)
5
6Author:         Reinhold P. Weicker,  CACM Vol 27, No 10, 10/84 pg. 1013.
7
8                Translated from ADA to C by Rick Richardson.
9                Every method to preserve ADA-likeness has been used,
10                at the expense of C-ness.
11
12                Translated from C to Python by Guido van Rossum.
13"""
14
15__version__ = "1.2"
16
17[Ident1, Ident2, Ident3, Ident4, Ident5] = range(1, 6)
18
19
20class Record:
21    def __init__(self, PtrComp=None, Discr=0, EnumComp=0, IntComp=0, StringComp=0):
22        self.PtrComp = PtrComp
23        self.Discr = Discr
24        self.EnumComp = EnumComp
25        self.IntComp = IntComp
26        self.StringComp = StringComp
27
28    def copy(self):
29        return Record(self.PtrComp, self.Discr, self.EnumComp, self.IntComp, self.StringComp)
30
31
32TRUE = 1
33FALSE = 0
34
35
36def Setup():
37    global IntGlob
38    global BoolGlob
39    global Char1Glob
40    global Char2Glob
41    global Array1Glob
42    global Array2Glob
43
44    IntGlob = 0
45    BoolGlob = FALSE
46    Char1Glob = "\0"
47    Char2Glob = "\0"
48    Array1Glob = [0] * 51
49    Array2Glob = [x[:] for x in [Array1Glob] * 51]
50
51
52def Proc0(loops):
53    global IntGlob
54    global BoolGlob
55    global Char1Glob
56    global Char2Glob
57    global Array1Glob
58    global Array2Glob
59    global PtrGlb
60    global PtrGlbNext
61
62    PtrGlbNext = Record()
63    PtrGlb = Record()
64    PtrGlb.PtrComp = PtrGlbNext
65    PtrGlb.Discr = Ident1
66    PtrGlb.EnumComp = Ident3
67    PtrGlb.IntComp = 40
68    PtrGlb.StringComp = "DHRYSTONE PROGRAM, SOME STRING"
69    String1Loc = "DHRYSTONE PROGRAM, 1'ST STRING"
70    Array2Glob[8][7] = 10
71
72    for i in range(loops):
73        Proc5()
74        Proc4()
75        IntLoc1 = 2
76        IntLoc2 = 3
77        String2Loc = "DHRYSTONE PROGRAM, 2'ND STRING"
78        EnumLoc = Ident2
79        BoolGlob = not Func2(String1Loc, String2Loc)
80        while IntLoc1 < IntLoc2:
81            IntLoc3 = 5 * IntLoc1 - IntLoc2
82            IntLoc3 = Proc7(IntLoc1, IntLoc2)
83            IntLoc1 = IntLoc1 + 1
84        Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3)
85        PtrGlb = Proc1(PtrGlb)
86        CharIndex = "A"
87        while CharIndex <= Char2Glob:
88            if EnumLoc == Func1(CharIndex, "C"):
89                EnumLoc = Proc6(Ident1)
90            CharIndex = chr(ord(CharIndex) + 1)
91        IntLoc3 = IntLoc2 * IntLoc1
92        IntLoc2 = IntLoc3 // IntLoc1
93        IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1
94        IntLoc1 = Proc2(IntLoc1)
95
96
97def Proc1(PtrParIn):
98    PtrParIn.PtrComp = NextRecord = PtrGlb.copy()
99    PtrParIn.IntComp = 5
100    NextRecord.IntComp = PtrParIn.IntComp
101    NextRecord.PtrComp = PtrParIn.PtrComp
102    NextRecord.PtrComp = Proc3(NextRecord.PtrComp)
103    if NextRecord.Discr == Ident1:
104        NextRecord.IntComp = 6
105        NextRecord.EnumComp = Proc6(PtrParIn.EnumComp)
106        NextRecord.PtrComp = PtrGlb.PtrComp
107        NextRecord.IntComp = Proc7(NextRecord.IntComp, 10)
108    else:
109        PtrParIn = NextRecord.copy()
110    NextRecord.PtrComp = None
111    return PtrParIn
112
113
114def Proc2(IntParIO):
115    IntLoc = IntParIO + 10
116    while 1:
117        if Char1Glob == "A":
118            IntLoc = IntLoc - 1
119            IntParIO = IntLoc - IntGlob
120            EnumLoc = Ident1
121        if EnumLoc == Ident1:
122            break
123    return IntParIO
124
125
126def Proc3(PtrParOut):
127    global IntGlob
128
129    if PtrGlb is not None:
130        PtrParOut = PtrGlb.PtrComp
131    else:
132        IntGlob = 100
133    PtrGlb.IntComp = Proc7(10, IntGlob)
134    return PtrParOut
135
136
137def Proc4():
138    global Char2Glob
139
140    BoolLoc = Char1Glob == "A"
141    BoolLoc = BoolLoc or BoolGlob
142    Char2Glob = "B"
143
144
145def Proc5():
146    global Char1Glob
147    global BoolGlob
148
149    Char1Glob = "A"
150    BoolGlob = FALSE
151
152
153def Proc6(EnumParIn):
154    EnumParOut = EnumParIn
155    if not Func3(EnumParIn):
156        EnumParOut = Ident4
157    if EnumParIn == Ident1:
158        EnumParOut = Ident1
159    elif EnumParIn == Ident2:
160        if IntGlob > 100:
161            EnumParOut = Ident1
162        else:
163            EnumParOut = Ident4
164    elif EnumParIn == Ident3:
165        EnumParOut = Ident2
166    elif EnumParIn == Ident4:
167        pass
168    elif EnumParIn == Ident5:
169        EnumParOut = Ident3
170    return EnumParOut
171
172
173def Proc7(IntParI1, IntParI2):
174    IntLoc = IntParI1 + 2
175    IntParOut = IntParI2 + IntLoc
176    return IntParOut
177
178
179def Proc8(Array1Par, Array2Par, IntParI1, IntParI2):
180    global IntGlob
181
182    IntLoc = IntParI1 + 5
183    Array1Par[IntLoc] = IntParI2
184    Array1Par[IntLoc + 1] = Array1Par[IntLoc]
185    Array1Par[IntLoc + 30] = IntLoc
186    for IntIndex in range(IntLoc, IntLoc + 2):
187        Array2Par[IntLoc][IntIndex] = IntLoc
188    Array2Par[IntLoc][IntLoc - 1] = Array2Par[IntLoc][IntLoc - 1] + 1
189    Array2Par[IntLoc + 20][IntLoc] = Array1Par[IntLoc]
190    IntGlob = 5
191
192
193def Func1(CharPar1, CharPar2):
194    CharLoc1 = CharPar1
195    CharLoc2 = CharLoc1
196    if CharLoc2 != CharPar2:
197        return Ident1
198    else:
199        return Ident2
200
201
202def Func2(StrParI1, StrParI2):
203    IntLoc = 1
204    while IntLoc <= 1:
205        if Func1(StrParI1[IntLoc], StrParI2[IntLoc + 1]) == Ident1:
206            CharLoc = "A"
207            IntLoc = IntLoc + 1
208    if CharLoc >= "W" and CharLoc <= "Z":
209        IntLoc = 7
210    if CharLoc == "X":
211        return TRUE
212    else:
213        if StrParI1 > StrParI2:
214            IntLoc = IntLoc + 7
215            return TRUE
216        else:
217            return FALSE
218
219
220def Func3(EnumParIn):
221    EnumLoc = EnumParIn
222    if EnumLoc == Ident3:
223        return TRUE
224    return FALSE
225
226
227###########################################################################
228# Benchmark interface
229
230bm_params = {
231    (50, 10): (80,),
232    (100, 10): (300,),
233    (1000, 10): (4000,),
234    (5000, 10): (20000,),
235}
236
237
238def bm_setup(params):
239    Setup()
240    return lambda: Proc0(params[0]), lambda: (params[0], 0)
241