Rev 9560 | Rev 9671 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 9560 | Rev 9659 | ||
---|---|---|---|
Line 31... | Line 31... | ||
31 | 31 | ||
Line 32... | Line 32... | ||
32 | BUF_SIZE = 65536; |
32 | BUF_SIZE = 65536; |
Line 33... | Line -... | ||
33 | - | ||
34 | NAME_LEN = 1024; |
- | |
Line 35... | Line 33... | ||
35 | 33 | ||
Line 36... | Line 34... | ||
36 | EOL_CRLF* = 0; EOL_LF* = 1; EOL_CR* = 2; |
34 | NAME_LEN = 1024; |
Line 37... | Line -... | ||
37 | - | ||
38 | - | ||
39 | TYPE |
35 | |
40 | 36 | ||
41 | tFileName* = ARRAY NAME_LEN OF CHAR; |
37 | TYPE |
42 | 38 | ||
43 | tEOL = ARRAY 3 OF WCHAR; |
39 | tFileName* = ARRAY NAME_LEN OF CHAR; |
Line 53... | Line 49... | ||
53 | 49 | ||
54 | tOutput* = POINTER TO RECORD |
50 | tOutput* = POINTER TO RECORD |
55 | handle: File.FS; |
51 | handle: File.FS; |
56 | buffer: ARRAY BUF_SIZE OF BYTE; |
52 | buffer: ARRAY BUF_SIZE OF BYTE; |
57 | pos: INTEGER; |
53 | pos: INTEGER; |
58 | eol: tEOL; |
54 | eol: E.tEOL; |
59 | putChar: PROCEDURE (file: tOutput; code: INTEGER); |
55 | putChar: PROCEDURE (file: tOutput; code: INTEGER); |
60 | error: BOOLEAN |
56 | error: BOOLEAN |
Line 61... | Line -... | ||
61 | END; |
- | |
62 | - | ||
63 | - | ||
64 | VAR |
- | |
65 | - | ||
66 | eol*: ARRAY 3 OF tEOL; |
- | |
67 | eolNames*: ARRAY 3, 16 OF WCHAR; |
57 | END; |
68 | 58 | ||
69 | 59 | ||
70 | PROCEDURE getByte (file: tInput): BYTE; |
60 | PROCEDURE getByte (file: tInput): BYTE; |
71 | VAR |
61 | VAR |
Line 107... | Line 97... | ||
107 | DEC(b, 0C0H); |
97 | DEC(b, 0C0H); |
108 | n := 1 |
98 | n := 1 |
109 | ELSIF (0E0H <= b) & (b <= 0EFH) THEN |
99 | ELSIF (0E0H <= b) & (b <= 0EFH) THEN |
110 | DEC(b, 0E0H); |
100 | DEC(b, 0E0H); |
111 | n := 2 |
101 | n := 2 |
- | 102 | ELSE |
|
- | 103 | n := -1 |
|
112 | ELSIF (0F0H <= b) & (b <= 0F7H) THEN |
104 | (* ELSIF (0F0H <= b) & (b <= 0F7H) THEN |
113 | DEC(b, 0F0H); |
105 | DEC(b, 0F0H); |
114 | n := 3 |
106 | n := 3 |
115 | ELSIF (0F8H <= b) & (b <= 0FBH) THEN |
107 | ELSIF (0F8H <= b) & (b <= 0FBH) THEN |
116 | DEC(b, 0F8H); |
108 | DEC(b, 0F8H); |
117 | n := 4 |
109 | n := 4 |
Line 122... | Line 114... | ||
122 | b := 0; |
114 | b := 0; |
123 | n := 6 |
115 | n := 6 |
124 | ELSIF b = 0FFH THEN |
116 | ELSIF b = 0FFH THEN |
125 | n := -1 |
117 | n := -1 |
126 | ELSIF (080H <= b) & (b <= 0BFH) THEN |
118 | ELSIF (080H <= b) & (b <= 0BFH) THEN |
127 | n := -1 |
119 | n := -1*) |
128 | END; |
120 | END; |
Line 129... | Line 121... | ||
129 | 121 | ||
130 | code := b; |
122 | code := b; |
131 | 123 | (* |
|
132 | IF n > 2 THEN |
124 | IF n > 2 THEN |
133 | n := -1 |
125 | n := -1 |
134 | END; |
126 | END; |
135 | 127 | *) |
|
136 | WHILE n > 0 DO |
128 | WHILE n > 0 DO |
137 | DEC(n); |
129 | DEC(n); |
138 | b := peakByte(file); |
130 | b := peakByte(file); |
139 | IF (080H <= b) & (b <= 0BFH) THEN |
131 | IF (080H <= b) & (b <= 0BFH) THEN |
Line 158... | Line 150... | ||
158 | 150 | ||
159 | PROCEDURE getCharCP866 (file: tInput): INTEGER; |
151 | PROCEDURE getCharCP866 (file: tInput): INTEGER; |
160 | RETURN E.cp866[getByte(file)] |
152 | RETURN E.cp866[getByte(file)] |
Line 161... | Line 153... | ||
161 | END getCharCP866; |
153 | END getCharCP866; |
162 | 154 | ||
163 | 155 | (* |
|
164 | PROCEDURE getCharUTF16LE (file: tInput): INTEGER; |
156 | PROCEDURE getCharUTF16LE (file: tInput): INTEGER; |
165 | RETURN getByte(file) + getByte(file) * 256 |
157 | RETURN getByte(file) + getByte(file) * 256 |
Line 166... | Line 158... | ||
166 | END getCharUTF16LE; |
158 | END getCharUTF16LE; |
167 | 159 | *) |
|
168 | 160 | ||
169 | PROCEDURE getString* (file: tInput; line: Lines.tLine; tabs: BOOLEAN; VAR eol: BOOLEAN): INTEGER; |
161 | PROCEDURE getString* (file: tInput; line: Lines.tLine; tabs: BOOLEAN; VAR eol: BOOLEAN): INTEGER; |
Line 297... | Line 289... | ||
297 | res := -1; |
289 | res := -1; |
298 | pos := text.pos; |
290 | pos := text.pos; |
299 | cnt := text.cnt; |
291 | cnt := text.cnt; |
300 | WHILE (text.cnt > 0) & (res = -1) DO |
292 | WHILE (text.cnt > 0) & (res = -1) DO |
301 | c := text.getChar(text); |
293 | c := text.getChar(text); |
302 | IF c = 10 THEN |
294 | IF CHR(c) = LF THEN |
303 | res := EOL_LF |
295 | res := E.EOL_LF |
304 | ELSIF c = 13 THEN |
296 | ELSIF CHR(c) = CR THEN |
305 | IF text.getChar(text) = 10 THEN |
297 | IF CHR(text.getChar(text)) = LF THEN |
306 | res := EOL_CRLF |
298 | res := E.EOL_CRLF |
307 | ELSE |
299 | ELSE |
308 | res := EOL_CR |
300 | res := E.EOL_CR |
309 | END |
301 | END |
310 | END |
302 | END |
311 | END; |
303 | END; |
312 | text.cnt := cnt; |
304 | text.cnt := cnt; |
313 | text.pos := pos; |
305 | text.pos := pos; |
314 | IF res = -1 THEN |
306 | IF res = -1 THEN |
315 | res := EOL_CRLF |
307 | res := E.EOL_CRLF |
316 | END |
308 | END |
317 | RETURN res |
309 | RETURN res |
318 | END detectEOL; |
310 | END detectEOL; |
Line 371... | Line 363... | ||
371 | END; |
363 | END; |
372 | IF res.buffer = 0 THEN |
364 | IF res.buffer = 0 THEN |
373 | DISPOSE(res) |
365 | DISPOSE(res) |
374 | ELSE |
366 | ELSE |
375 | enc := detectEncoding(res); |
367 | enc := detectEncoding(res); |
376 | IF (enc = E.UTF8BOM) OR (enc = E.UTF8) THEN |
368 | IF enc IN {E.UTF8BOM, E.UTF8} THEN |
377 | res.getChar := getCharUTF8 |
369 | res.getChar := getCharUTF8 |
378 | ELSIF enc = E.CP866 THEN |
370 | ELSIF enc = E.CP866 THEN |
379 | res.getChar := getCharCP866 |
371 | res.getChar := getCharCP866 |
380 | ELSIF enc = E.W1251 THEN |
372 | ELSIF enc = E.W1251 THEN |
381 | res.getChar := getCharW1251 |
373 | res.getChar := getCharW1251 |
Line 425... | Line 417... | ||
425 | i: INTEGER; |
417 | i: INTEGER; |
426 | c: WCHAR; |
418 | c: WCHAR; |
427 | BEGIN |
419 | BEGIN |
428 | FOR i := 0 TO n - 1 DO |
420 | FOR i := 0 TO n - 1 DO |
429 | c := Lines.getChar(line, i); |
421 | c := Lines.getChar(line, i); |
430 | IF c = Lines.TAB1 THEN |
- | |
431 | (* nothing to do *) |
- | |
432 | ELSIF c = Lines.NUL THEN |
422 | IF c = Lines.NUL THEN |
433 | file.putChar(file, 0) |
423 | file.putChar(file, 0) |
434 | ELSE |
424 | ELSIF c # Lines.TAB1 THEN |
435 | file.putChar(file, ORD(c)) |
425 | file.putChar(file, ORD(c)) |
436 | END |
426 | END |
437 | END |
427 | END |
438 | END putString; |
428 | END putString; |
Line 465... | Line 455... | ||
465 | putByte(file, ORD("?")) |
455 | putByte(file, ORD("?")) |
466 | END |
456 | END |
467 | END putCharUTF8; |
457 | END putCharUTF8; |
Line 468... | Line 458... | ||
468 | 458 | ||
469 | 459 | ||
470 | PROCEDURE putCharW1251 (file: tOutput; code: INTEGER); |
460 | PROCEDURE putCharCP (file: tOutput; code, cp: INTEGER); |
471 | VAR |
461 | VAR |
472 | n: INTEGER; |
462 | n: INTEGER; |
473 | BEGIN |
463 | BEGIN |
474 | n := E.UNI[code, E.W1251]; |
464 | n := E.UNI[code, cp]; |
475 | IF n # E.UNDEF THEN |
465 | IF n # E.UNDEF THEN |
476 | putByte(file, n) |
466 | putByte(file, n) |
477 | ELSE |
467 | ELSE |
- | 468 | putByte(file, ORD("?")) |
|
- | 469 | END |
|
- | 470 | END putCharCP; |
|
- | 471 | ||
- | 472 | ||
- | 473 | PROCEDURE putCharW1251 (file: tOutput; code: INTEGER); |
|
478 | putByte(file, ORD("?")) |
474 | BEGIN |
Line 479... | Line 475... | ||
479 | END |
475 | putCharCP(file, code, E.W1251) |
480 | END putCharW1251; |
- | |
481 | - | ||
482 | 476 | END putCharW1251; |
|
483 | PROCEDURE putCharCP866 (file: tOutput; code: INTEGER); |
477 | |
484 | VAR |
- | |
485 | n: INTEGER; |
- | |
486 | BEGIN |
- | |
487 | n := E.UNI[code, E.CP866]; |
- | |
488 | IF n # E.UNDEF THEN |
- | |
489 | putByte(file, n) |
478 | |
Line 490... | Line 479... | ||
490 | ELSE |
479 | PROCEDURE putCharCP866 (file: tOutput; code: INTEGER); |
491 | putByte(file, ORD("?")) |
480 | BEGIN |
492 | END |
481 | putCharCP(file, code, E.CP866) |
493 | END putCharCP866; |
482 | END putCharCP866; |
494 | 483 | ||
495 | 484 | (* |
|
496 | PROCEDURE putCharUTF16LE (file: tOutput; code: INTEGER); |
485 | PROCEDURE putCharUTF16LE (file: tOutput; code: INTEGER); |
497 | BEGIN |
486 | BEGIN |
498 | IF ~((0 <= code) & (code <= 65535)) THEN |
487 | IF ~((0 <= code) & (code <= 65535)) THEN |
Line 499... | Line 488... | ||
499 | code := ORD("?") |
488 | code := ORD("?") |
500 | END; |
489 | END; |
501 | putByte(file, code MOD 256); |
490 | putByte(file, code MOD 256); |
Line 526... | Line 515... | ||
526 | VAR |
515 | VAR |
527 | res: tOutput; |
516 | res: tOutput; |
528 | BEGIN |
517 | BEGIN |
529 | NEW(res); |
518 | NEW(res); |
530 | res.pos := 0; |
519 | res.pos := 0; |
531 | res.eol := eol[nl]; |
520 | res.eol := E.eol[nl]; |
532 | res.putChar := NIL; |
521 | res.putChar := NIL; |
533 | IF (enc = E.UTF8) OR (enc = E.UTF8BOM) THEN |
522 | IF enc IN {E.UTF8BOM, E.UTF8} THEN |
534 | res.putChar := putCharUTF8; |
- | |
535 | IF enc = E.UTF8BOM THEN |
523 | IF enc = E.UTF8BOM THEN |
536 | res.putChar(res, ORD(BOM)) |
524 | putCharUTF8(res, ORD(BOM)) |
537 | END |
525 | END; |
- | 526 | res.putChar := putCharUTF8 |
|
538 | ELSIF enc = E.UTF16LE THEN |
527 | (*ELSIF enc = E.UTF16LE THEN |
539 | res.putChar := putCharUTF16LE; |
528 | res.putChar := putCharUTF16LE*) |
540 | ELSIF enc = E.W1251 THEN |
529 | ELSIF enc = E.W1251 THEN |
541 | res.putChar := putCharW1251 |
530 | res.putChar := putCharW1251 |
542 | ELSIF enc = E.CP866 THEN |
531 | ELSIF enc = E.CP866 THEN |
543 | res.putChar := putCharCP866 |
532 | res.putChar := putCharCP866 |
544 | END; |
533 | END; |
Line 566... | Line 555... | ||
566 | DISPOSE(file) |
555 | DISPOSE(file) |
567 | END |
556 | END |
568 | END destroy; |
557 | END destroy; |
Line 569... | Line -... | ||
569 | - | ||
570 | - | ||
571 | BEGIN |
- | |
572 | eol[EOL_CRLF] := CR + LF; |
- | |
573 | eol[EOL_LF] := LF; |
- | |
574 | eol[EOL_CR] := CR; |
- | |
575 | eolNames[EOL_CRLF] := "CRLF"; |
- | |
576 | eolNames[EOL_LF] := "LF"; |
558 | |
577 | eolNames[EOL_CR] := "CR" |
559 |