Subversion Repositories Kolibri OS

Rev

Rev 4865 | Rev 4882 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4865 Rev 4875
Line 10... Line 10...
10
 {
10
 {
11
    mov     [error_n], err
11
    mov     [error_n], err
12
    ret
12
    ret
13
 }
13
 }
Line 14... Line -...
14
 
-
 
15
 proc convert_to_str uses ebx ecx edx esi edi, _num, _str
-
 
16
    mov     eax, [_num]
-
 
17
    mov     esi, [_str]
-
 
18
    mov     edi, 0
-
 
19
    mov     ecx, eax
-
 
20
    and     ecx, 1 shl 31
-
 
21
    cmp     ecx, 0
-
 
22
    je	    @f
-
 
23
    mov     [esi], byte "-"
-
 
24
    inc     esi
-
 
25
    inc     edi
-
 
26
    not     eax
-
 
27
    inc     eax
-
 
28
  @@:
-
 
29
    mov     ebx, 10
-
 
30
    xor     ecx, ecx
-
 
31
  @@:
-
 
32
    xor     edx, edx
-
 
33
    div     ebx
-
 
34
    push    edx
-
 
35
    inc     ecx
-
 
36
    inc     edi
-
 
37
    cmp     eax, 0
-
 
38
    jne     @b
-
 
39
  @@:
-
 
40
    pop     eax
-
 
41
    add     al, "0"
-
 
42
    mov     [esi], al
-
 
43
    inc     esi
-
 
44
    loop    @b
-
 
45
    mov     [esi], byte 0
-
 
46
    mov     eax, edi
-
 
47
    ret
-
 
48
 endp
-
 
49
 
14
 
Line 50... Line 15...
50
 ; ---------------------------
15
 ; ---------------------------
51
 
16
 
-
 
17
 proc parse
-
 
18
    mov     [exp_pos], 0
-
 
19
    stdcall skip_spaces
-
 
20
 
-
 
21
    mov     ebx, exp
-
 
22
    add     ebx, [exp_pos]
-
 
23
    cmp     [ebx], byte 0
-
 
24
    je	    .null_exp
52
 proc parse
25
 
53
    mov     [exp_pos], 0
26
    mov     [exp_lvl], 0
54
    mov     [error_n], 0
27
    mov     [error_n], 0
-
 
28
    stdcall parse_lvl0
-
 
29
    ret
-
 
30
 
-
 
31
 .null_exp:
55
    stdcall parse_lvl0
32
    mov     eax, 0
Line 56... Line 33...
56
    ret
33
    ret
Line 57... Line 34...
57
 endp
34
 endp
Line 66... Line 43...
66
    mov     ebx, exp
43
    mov     ebx, exp
67
    add     ebx, [exp_pos]
44
    add     ebx, [exp_pos]
68
    cmp     [ebx], byte 0
45
    cmp     [ebx], byte 0
69
    je	    .end
46
    je	    .end
70
    cmp     [ebx], byte ")"
47
    cmp     [ebx], byte ")"
71
    je	    .end
48
    je	    .brk_end
72
    inc     [exp_pos]
49
    inc     [exp_pos]
73
    cmp     [ebx], byte "+"
50
    cmp     [ebx], byte "+"
74
    jne     .not_add
51
    jne     .not_add
75
    mov     ecx, eax
52
    mov     ecx, eax
76
    stdcall parse_lvl1
53
    stdcall parse_lvl1
77
    test_err
54
    test_err
78
    add     eax, ecx
55
    add     eax, ecx
79
    jmp     @b
56
    jmp     @b
80
 .not_add:
57
 .not_add:
81
    cmp     [ebx], byte "-"
58
    cmp     [ebx], byte "-"
82
    jne     @b
59
    jne     .unexp_char
83
    mov     ecx, eax
60
    mov     ecx, eax
84
    stdcall parse_lvl1
61
    stdcall parse_lvl1
85
    test_err
62
    test_err
86
    sub     ecx, eax
63
    sub     ecx, eax
87
    mov     eax, ecx
64
    mov     eax, ecx
88
    jmp     @b
65
    jmp     @b
-
 
66
 .brk_end:
-
 
67
    cmp     [exp_lvl], 0
-
 
68
    jne     @f
-
 
69
    set_err 3
-
 
70
  @@:
-
 
71
    dec     [exp_lvl]
89
 .end:
72
 .end:
90
    ret
73
    ret
-
 
74
 .unexp_char:
-
 
75
    set_err 4
91
 endp
76
 endp
Line 92... Line 77...
92
 
77
 
Line 93... Line 78...
93
 ; ---------------------------
78
 ; ---------------------------
Line 99... Line 84...
99
  @@:
84
  @@:
100
    mov     ebx, exp
85
    mov     ebx, exp
101
    add     ebx, [exp_pos]
86
    add     ebx, [exp_pos]
102
    cmp     [ebx], byte 0
87
    cmp     [ebx], byte 0
103
    je	    .end
88
    je	    .end
104
    inc     [exp_pos]
-
 
105
    cmp     [ebx], byte "*"
89
    cmp     [ebx], byte "*"
106
    jne     .not_mul
90
    jne     .not_mul
-
 
91
    inc     [exp_pos]
107
    mov     ecx, eax
92
    mov     ecx, eax
108
    stdcall parse_lvl2
93
    stdcall parse_lvl2
109
    test_err
94
    test_err
110
    imul    ecx, eax
95
    imul    ecx, eax
111
    mov     eax, ecx
96
    mov     eax, ecx
Line 115... Line 100...
115
    je	    .div_or_mod
100
    je	    .div_or_mod
116
    cmp     [ebx], byte "%"
101
    cmp     [ebx], byte "%"
117
    je	    .div_or_mod
102
    je	    .div_or_mod
118
    jmp     .end
103
    jmp     .end
119
 .div_or_mod:
104
 .div_or_mod:
-
 
105
    inc     [exp_pos]
120
    mov     ecx, eax
106
    mov     ecx, eax
121
    stdcall parse_lvl2
107
    stdcall parse_lvl2
122
    test_err
108
    test_err
123
    cmp     eax, 0
109
    cmp     eax, 0
124
    jne     .not_null
110
    jne     .not_null
Line 132... Line 118...
132
    jmp     @b
118
    jmp     @b
133
 .mod:
119
 .mod:
134
    mov     eax, edx
120
    mov     eax, edx
135
    jmp     @b
121
    jmp     @b
136
 .end:
122
 .end:
137
    dec     [exp_pos]
-
 
138
    ret
123
    ret
139
 endp
124
 endp
Line 140... Line 125...
140
 
125
 
Line -... Line 126...
-
 
126
 ; ---------------------------
-
 
127
 
-
 
128
 proc parse_lvl2 uses ebx ecx edx
-
 
129
    test_err
-
 
130
    stdcall parse_lvl3
-
 
131
    test_err
-
 
132
  @@:
-
 
133
    mov     ebx, exp
-
 
134
    add     ebx, [exp_pos]
-
 
135
    cmp     [ebx], byte 0
-
 
136
    je	    .end
-
 
137
    cmp     [ebx], byte "^"
-
 
138
    jne     .end
-
 
139
    inc     [exp_pos]
-
 
140
    mov     ecx, eax
-
 
141
    stdcall parse_lvl2
-
 
142
    test_err
-
 
143
    stdcall c_power
-
 
144
    jmp     @b
-
 
145
 .end:
-
 
146
    ret
-
 
147
 endp
-
 
148
 
141
 ; ---------------------------
149
 ; ---------------------------
142
 
150
 
143
 proc parse_lvl2 uses ebx
151
 proc parse_lvl3 uses ebx
144
    test_err
152
    test_err
145
    stdcall skip_spaces
153
    stdcall skip_spaces
146
    mov     ebx, exp
154
    mov     ebx, exp
147
    add     ebx, [exp_pos]
155
    add     ebx, [exp_pos]
148
    cmp     [ebx], byte 48
156
    cmp     [ebx], byte 48
149
    jl	    @f
157
    jl	    @f
150
    cmp     [ebx], byte 57
158
    cmp     [ebx], byte 57
151
    jg	    @f
159
    jg	    @f
152
    stdcall parse_lvl3
160
    stdcall parse_lvl4
153
    jmp     .end
161
    jmp     .end
154
  @@:
162
  @@:
155
    inc     [exp_pos]
163
    inc     [exp_pos]
-
 
164
    cmp     [ebx], byte "("
156
    cmp     [ebx], byte "("
165
    jne     @f
157
    jne     @f
166
    inc     [exp_lvl]
-
 
167
    stdcall parse_lvl0
-
 
168
    test_err
-
 
169
    mov     ebx, exp
-
 
170
    add     ebx, [exp_pos]
-
 
171
    cmp     [ebx], byte ")"
-
 
172
    je	    .brk_ok
158
    stdcall parse_lvl0
173
    set_err 2
159
    test_err
174
 .brk_ok:
160
    inc     [exp_pos]
175
    inc     [exp_pos]
161
    jmp     .end
176
    jmp     .end
162
  @@:
177
  @@:
163
    cmp     [ebx], byte "+"
178
    cmp     [ebx], byte "+"
164
    jne     @f
179
    jne     @f
165
    stdcall parse_lvl2
180
    stdcall parse_lvl3
166
    test_err
181
    test_err
167
    jmp     .end
182
    jmp     .end
168
  @@:
183
  @@:
169
    cmp     [ebx], byte "-"
184
    cmp     [ebx], byte "-"
170
    jne     .end
185
    jne     .unexp_char
171
    stdcall parse_lvl2
186
    stdcall parse_lvl3
172
    test_err
187
    test_err
173
    neg     eax
188
    neg     eax
174
 .end:
189
 .end:
-
 
190
    stdcall skip_spaces
-
 
191
    ret
-
 
192
 .unexp_char:
-
 
193
    set_err 4
-
 
194
 endp
-
 
195
 
-
 
196
 ; ---------------------------
-
 
197
 
-
 
198
 proc parse_lvl4 uses ebx ecx
-
 
199
    stdcall parse_lvl5
-
 
200
  @@:
-
 
201
    mov     ebx, exp
-
 
202
    add     ebx, [exp_pos]
-
 
203
    cmp     [ebx], byte 0
-
 
204
    je	    .end
-
 
205
    cmp     [ebx], byte "^"
-
 
206
    jne     .end
-
 
207
    inc     [exp_pos]
-
 
208
    mov     ecx, eax
-
 
209
    mov     ebx, exp
-
 
210
    add     ebx, [exp_pos]
-
 
211
    cmp     [ebx], byte 48
-
 
212
    jl	    .unexp_char
-
 
213
    cmp     [ebx], byte 57
-
 
214
    jg	    .unexp_char
-
 
215
    stdcall parse_lvl4
-
 
216
    stdcall c_power
-
 
217
    jmp     @b
-
 
218
 .end:
-
 
219
    ret
175
    stdcall skip_spaces
220
 .unexp_char:
Line 176... Line 221...
176
    ret
221
    set_err 4
Line 177... Line 222...
177
 endp
222
 endp
178
 
223
 
179
 ; ---------------------------
224
 ; ---------------------------
180
 
225
 
181
 proc parse_lvl3 uses ebx ecx
226
 proc parse_lvl5 uses ebx ecx
182
    sub     eax, eax
227
    sub     eax, eax
Line 213... Line 258...
213
    inc     [exp_pos]
258
    inc     [exp_pos]
214
    jmp     @b
259
    jmp     @b
215
  @@:
260
  @@:
216
    ret
261
    ret
217
 endp
262
 endp
218
263
 
-
 
264
 ; ---------------------------
-
 
265
 
-
 
266
 proc c_power uses ebx
-
 
267
    mov     ebx, eax
-
 
268
    mov     eax, 1
-
 
269
  @@:
-
 
270
    cmp     ebx, 0
-
 
271
    je	    @f
-
 
272
    imul    eax, ecx
-
 
273
    dec     ebx
-
 
274
    jmp     @b
-
 
275
  @@:
-
 
276
    ret
-
 
277
 endp
-
 
278
 
-
 
279
 ; ---------------------------
-
 
280
 
-
 
281
 proc convert_to_str uses ebx ecx edx esi edi, _num, _str
-
 
282
    mov     eax, [_num]
-
 
283
    mov     esi, [_str]
-
 
284
    mov     edi, 0
-
 
285
    mov     ecx, eax
-
 
286
    and     ecx, 1 shl 31
-
 
287
    cmp     ecx, 0
-
 
288
    je	    @f
-
 
289
    mov     [esi], byte "-"
-
 
290
    inc     esi
-
 
291
    inc     edi
-
 
292
    not     eax
-
 
293
    inc     eax
-
 
294
  @@:
-
 
295
    mov     ebx, 10
-
 
296
    xor     ecx, ecx
-
 
297
  @@:
-
 
298
    xor     edx, edx
-
 
299
    div     ebx
-
 
300
    push    edx
-
 
301
    inc     ecx
-
 
302
    inc     edi
-
 
303
    cmp     eax, 0
-
 
304
    jne     @b
-
 
305
  @@:
-
 
306
    pop     eax
-
 
307
    add     al, "0"
-
 
308
    mov     [esi], al
-
 
309
    inc     esi
-
 
310
    loop    @b
-
 
311
    mov     [esi], byte 0
-
 
312
    mov     eax, edi
-
 
313
    ret
-
 
314
 endp
-
 
315
219
316