Subversion Repositories Kolibri OS

Rev

Rev 4865 | Rev 4882 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4865 Rev 4875
1
macro test_err
1
macro test_err
2
 {  local   ..not_error
2
 {  local   ..not_error
3
    cmp     [error_n], 0
3
    cmp     [error_n], 0
4
    je	    ..not_error
4
    je	    ..not_error
5
    ret
5
    ret
6
 ..not_error:
6
 ..not_error:
7
 }
7
 }
8
 
8
 
9
 macro set_err err
9
 macro set_err err
10
 {
10
 {
11
    mov     [error_n], err
11
    mov     [error_n], err
12
    ret
12
    ret
13
 }
13
 }
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
 
50
 ; ---------------------------
15
 ; ---------------------------
51
 
16
 
52
 proc parse
17
 proc parse
53
    mov     [exp_pos], 0
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
-
 
25
 
-
 
26
    mov     [exp_lvl], 0
54
    mov     [error_n], 0
27
    mov     [error_n], 0
55
    stdcall parse_lvl0
28
    stdcall parse_lvl0
56
    ret
29
    ret
-
 
30
 
-
 
31
 .null_exp:
-
 
32
    mov     eax, 0
-
 
33
    ret
57
 endp
34
 endp
58
 
35
 
59
 ; ---------------------------
36
 ; ---------------------------
60
 
37
 
61
 proc parse_lvl0 uses ebx ecx
38
 proc parse_lvl0 uses ebx ecx
62
    test_err
39
    test_err
63
    stdcall parse_lvl1
40
    stdcall parse_lvl1
64
    test_err
41
    test_err
65
  @@:
42
  @@:
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
92
 
77
 
93
 ; ---------------------------
78
 ; ---------------------------
94
 
79
 
95
 proc parse_lvl1 uses ebx ecx edx
80
 proc parse_lvl1 uses ebx ecx edx
96
    test_err
81
    test_err
97
    stdcall parse_lvl2
82
    stdcall parse_lvl2
98
    test_err
83
    test_err
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
112
    jmp     @b
97
    jmp     @b
113
 .not_mul:
98
 .not_mul:
114
    cmp     [ebx], byte "/"
99
    cmp     [ebx], byte "/"
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
125
    set_err 1
111
    set_err 1
126
 .not_null:
112
 .not_null:
127
    xchg    ecx, eax
113
    xchg    ecx, eax
128
    cdq
114
    cdq
129
    div     ecx
115
    div     ecx
130
    cmp     [ebx], byte "%"
116
    cmp     [ebx], byte "%"
131
    je	    .mod
117
    je	    .mod
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
140
 
125
 
141
 ; ---------------------------
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
 
-
 
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]
156
    cmp     [ebx], byte "("
164
    cmp     [ebx], byte "("
157
    jne     @f
165
    jne     @f
-
 
166
    inc     [exp_lvl]
158
    stdcall parse_lvl0
167
    stdcall parse_lvl0
159
    test_err
168
    test_err
-
 
169
    mov     ebx, exp
-
 
170
    add     ebx, [exp_pos]
-
 
171
    cmp     [ebx], byte ")"
-
 
172
    je	    .brk_ok
-
 
173
    set_err 2
-
 
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:
175
    stdcall skip_spaces
190
    stdcall skip_spaces
176
    ret
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
-
 
220
 .unexp_char:
-
 
221
    set_err 4
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
183
    sub     ecx, ecx
228
    sub     ecx, ecx
184
    mov     ebx, exp
229
    mov     ebx, exp
185
    add     ebx, [exp_pos]
230
    add     ebx, [exp_pos]
186
  @@:
231
  @@:
187
    cmp     [ebx], byte 0
232
    cmp     [ebx], byte 0
188
    je	    @f
233
    je	    @f
189
    cmp     [ebx], byte 48
234
    cmp     [ebx], byte 48
190
    jl	    @f
235
    jl	    @f
191
    cmp     [ebx], byte 57
236
    cmp     [ebx], byte 57
192
    jg	    @f
237
    jg	    @f
193
    imul    eax, 10
238
    imul    eax, 10
194
    mov     cl, [ebx]
239
    mov     cl, [ebx]
195
    add     eax, ecx
240
    add     eax, ecx
196
    sub     eax, 48
241
    sub     eax, 48
197
    inc     ebx
242
    inc     ebx
198
    inc     [exp_pos]
243
    inc     [exp_pos]
199
    jmp     @b
244
    jmp     @b
200
  @@:
245
  @@:
201
    ret
246
    ret
202
 endp
247
 endp
203
 
248
 
204
 ; ---------------------------
249
 ; ---------------------------
205
 
250
 
206
 proc skip_spaces uses ebx
251
 proc skip_spaces uses ebx
207
    mov     ebx, exp
252
    mov     ebx, exp
208
    add     ebx, [exp_pos]
253
    add     ebx, [exp_pos]
209
  @@:
254
  @@:
210
    cmp     [ebx], byte " "
255
    cmp     [ebx], byte " "
211
    jne     @f
256
    jne     @f
212
    inc     ebx
257
    inc     ebx
213
    inc     [exp_pos]
258
    inc     [exp_pos]
214
    jmp     @b
259
    jmp     @b
215
  @@:
260
  @@:
216
    ret
261
    ret
-
 
262
 endp
-
 
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
217
 endp
314
 endp
218
315