Subversion Repositories Kolibri OS

Rev

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