-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparserio.pas
361 lines (329 loc) · 7.38 KB
/
parserio.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
unit ParserIO;
{$S-,Q-,R-,V-,B-,X+}
{$PACKRECORDS 1}
interface
function Scan(var buf; skip,size: Longint; str: String): Longint;
function SensitiveScan(var buf; skip,size: Longint; str: String): Longint;
function Compare(var buf1,buf2; size: Longint): Boolean;
function Empty(var buf; size: Longint): Boolean;
function CountLines(var buf; size: Longint): Longint;
function Update16(var buf; size: Longint; crc: Word): Word;
function Update32(var buf; size: Longint; crc: Longint): Longint;
implementation
uses
StringIO;
var
CRC16_table: array[BYTE] of Word;
CRC32_table: array[BYTE] of Longint;
function Scan(var buf; skip,size: Longint; str: String): Longint;
var
result: Longint;
begin
asm
lea edi,[str]
mov esi,edi
xor eax,eax
lodsb
stosb
xor ecx,ecx
mov ecx,eax
xor ebx,ebx
mov ebx,eax
jecxz @@9
@@1: lodsb
cmp al,'a'
jb @@2
cmp al,'z'
ja @@2
sub al,20h
@@2: stosb
loop @@1
sub edi,ebx
mov esi,[buf]
add esi,skip
mov ecx,size
sub ecx,skip
jecxz @@8
cld
sub ecx,ebx
jb @@8
inc ecx
@@4: mov ah,[edi]
and ah,NOT 20h
@@5: lodsb
and al,NOT 20h
cmp al,ah
loopne @@5
jne @@8
dec esi
mov edx,ecx
mov ecx,ebx
@@6: repe cmpsb
je @@10
mov al,[esi-1]
cmp al,'a'
jb @@7
cmp al,'z'
ja @@7
sub al,20h
@@7: cmp al,[edi-1]
je @@6
sub ecx,ebx
add esi,ecx
add edi,ecx
inc esi
mov ecx,edx
jne @@4
@@8: xor eax,eax
jmp @@11
@@9: mov eax,1
jmp @@11
@@10: sub esi,ebx
mov eax,esi
sub eax,dword ptr [buf]
inc eax
@@11: dec eax
mov result,eax
end;
Scan := result;
end;
function SensitiveScan(var buf; skip,size: Longint; str: String): Longint;
var
result: Longint;
begin
asm
mov edi,[buf]
add edi,skip
lea esi,[str]
mov ecx,size
sub ecx,skip
xor eax,eax
jecxz @@3
cld
lodsb
cmp al,1
jb @@5
ja @@1
lodsb
repne scasb
jne @@3
jmp @@5
@@1: xor ah,ah
mov ebx,eax
dec ebx
mov edx,ecx
sub edx,eax
jb @@3
lodsb
add edx,2
@@2: dec edx
mov ecx,edx
repne scasb
jne @@3
mov edx,ecx
mov ecx,ebx
rep cmpsb
je @@4
sub ecx,ebx
add esi,ecx
add edi,ecx
inc edi
or edx,edx
jne @@2
@@3: xor eax,eax
jmp @@6
@@4: sub edi,ebx
@@5: mov eax,edi
sub eax,dword ptr [buf]
@@6: dec eax
mov result,eax
end;
SensitiveScan := result;
end;
function Compare(var buf1,buf2; size: Longint): Boolean;
var
result: Boolean;
begin
asm
xor edx,edx
mov eax,size
cmp eax,16
jb @@3
mov ecx,4
div ecx
mov ecx,eax
jecxz @@1
mov esi,[buf1]
mov edi,[buf2]
cld
repz cmpsd
jnz @@2
mov ecx,edx
jecxz @@1
repz cmpsb
jnz @@2
@@1: mov result,TRUE
jmp @@6
@@2: mov result,FALSE
jmp @@6
@@3: mov ecx,size
jecxz @@4
mov esi,[buf1]
mov edi,[buf2]
cld
repz cmpsb
jnz @@5
@@4: mov result,TRUE
jmp @@6
@@5: mov result,FALSE
@@6:
end;
Compare := result;
end;
function Empty(var buf; size: Longint): Boolean;
var
result: Boolean;
begin
asm
xor edx,edx
mov eax,size
cmp eax,16
jb @@3
mov ecx,4
div ecx
mov ecx,eax
jecxz @@1
mov edi,[buf]
xor eax,eax
repz scasd
jnz @@2
mov ecx,edx
jecxz @@1
repz scasb
jnz @@2
@@1: mov result,TRUE
jmp @@6
@@2: mov result,FALSE
jmp @@6
@@3: mov ecx,size
jecxz @@4
mov edi,[buf]
xor eax,eax
repz scasb
jnz @@5
@@4: mov result,TRUE
jmp @@6
@@5: mov result,FALSE
@@6:
end;
Empty := result;
end;
function CountLines(var buf; size: Longint): Longint;
var
result: Longint;
begin
asm
mov edi,[buf]
mov ecx,size
mov edx,edi
add edx,ecx
xor ebx,ebx
jecxz @@3
@@1: mov al,0dh
repnz scasb
jnz @@3
cmp byte ptr [edi],0ah
jnz @@2
inc edi
inc ebx
@@2: cmp edi,edx
jb @@1
@@3: mov eax,ebx
mov result,eax
end;
CountLines := result;
end;
function Update16(var buf; size: Longint; crc: Word): Word;
var
result: Word;
begin
asm
mov esi,[buf]
lea edi,[CRC16_table]
mov bx,crc
mov ecx,size
jecxz @@2
@@1: xor ax,ax
lodsb
mov dl,bh
xor dh,dh
xor bh,bh
xor bx,ax
and ebx,000000ffh
shl ebx,1
mov bx,[edi+ebx]
xor bx,dx
loop @@1
@@2: mov ax,bx
mov result,ax
end;
Update16 := result;
end;
function Update32(var buf; size: Longint; crc: Longint): Longint;
var
result: Longint;
begin
asm
mov esi,[buf]
lea edi,[CRC32_table]
mov ebx,crc
mov ecx,size
jecxz @@2
@@1: xor eax,eax
lodsb
xor ebx,eax
mov edx,ebx
and ebx,000000ffh
shl ebx,2
mov ebx,[edi+ebx]
shr edx,8
and edx,00ffffffh
xor ebx,edx
loop @@1
@@2: mov eax,ebx
mov result,eax
end;
Update32 := result;
end;
procedure make_table_16bit;
var
crc: Word;
n,index: Byte;
begin
For index := 0 to 255 do
begin
crc := index;
For n := 1 to 8 do
If Odd(crc) then crc := crc SHR 1 XOR $0a001
else crc := crc SHR 1;
CRC16_table[index] := crc;
end;
end;
procedure make_table_32bit;
var
crc: Dword;
n,index: Byte;
begin
For index := 0 to 255 do
begin
crc := index;
For n := 1 to 8 do
If Odd(crc) then crc := crc SHR 1 XOR $0edb88320
else crc := crc SHR 1;
CRC32_table[index] := crc;
end;
end;
begin
make_table_16bit;
make_table_32bit;
end.