Subversion Repositories Kolibri OS

Rev

Rev 9073 | Rev 9448 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8728 leency 1
(*
2
    Copyright 2021 Anton Krotov
3
 
4
    This file is part of CEdit.
5
 
6
    CEdit is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    CEdit is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with CEdit. If not, see .
18
*)
19
 
20
MODULE Clipboard;
21
 
22
IMPORT SYSTEM, K := KOSAPI, E := Encodings, Lines;
23
 
24
CONST
25
    TTEXT = 0;
26
    lenEOL* = 2;
9174 akron1 27
    TAB = 9X;
8728 leency 28
 
29
TYPE
30
    tBuffer* = POINTER TO RECORD
31
        dataPtr*: INTEGER;
32
        pos: INTEGER
33
    END;
34
 
35
 
36
PROCEDURE free (ptr: INTEGER);
37
BEGIN
38
    ptr := K.free(ptr)
39
END free;
40
 
41
 
42
PROCEDURE bufSize* (buffer: tBuffer): INTEGER;
43
    RETURN buffer.pos - buffer.dataPtr
44
END bufSize;
45
 
46
 
47
PROCEDURE put* (buffer: tBuffer);
48
VAR
49
    a, cnt, size: INTEGER;
50
    ptr, pchar: INTEGER;
51
    wch: WCHAR;
52
BEGIN
53
    cnt := bufSize(buffer) DIV 2;
54
    size := cnt + 12;
55
    a := K.malloc(size);
56
    ASSERT(a # 0);
57
    SYSTEM.PUT32(a + 4, TTEXT);
58
    SYSTEM.PUT32(a + 8, 1);
59
    pchar := a + 12;
60
    ptr := buffer.dataPtr;
61
    WHILE cnt > 0 DO
62
        SYSTEM.GET(ptr, wch);
9174 akron1 63
        IF wch # Lines.TAB1 THEN
64
            SYSTEM.PUT(pchar, CHR(E.UNI[ORD(wch), E.CP866] MOD 256));
65
            INC(pchar)
66
        ELSE
67
            DEC(size);
68
        END;
8728 leency 69
        INC(ptr, 2);
70
        DEC(cnt)
71
    END;
9174 akron1 72
    SYSTEM.PUT32(a, size);
8728 leency 73
    K.sysfunc2(54, 3);
74
    K.sysfunc4(54, 2, size, a)
75
END put;
76
 
77
 
78
PROCEDURE create* (bufSize: INTEGER): tBuffer;
79
VAR
80
    res: tBuffer;
81
BEGIN
82
    NEW(res);
83
    res.dataPtr := K.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
84
    ASSERT(res.dataPtr # 0);
85
    res.pos := res.dataPtr
86
    RETURN res
87
END create;
88
 
89
 
90
PROCEDURE destroy* (VAR buffer: tBuffer);
91
BEGIN
92
    IF buffer # NIL THEN
93
        IF buffer.dataPtr # 0 THEN
94
            free(buffer.dataPtr)
95
        END;
96
        DISPOSE(buffer)
97
    END
98
END destroy;
99
 
100
 
101
PROCEDURE append* (buffer: tBuffer; line: Lines.tLine; first, last: INTEGER);
102
VAR
103
    strSize: INTEGER;
104
BEGIN
105
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
106
    IF strSize > 0 THEN
107
        SYSTEM.MOVE(Lines.getPChar(line, first), buffer.pos, strSize);
108
        INC(buffer.pos, strSize)
109
    END
110
END append;
111
 
112
 
113
PROCEDURE appends* (buffer: tBuffer; s: ARRAY OF WCHAR; first, last: INTEGER);
114
VAR
115
    strSize: INTEGER;
116
BEGIN
117
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
118
    IF strSize > 0 THEN
119
        SYSTEM.MOVE(SYSTEM.ADR(s[first]), buffer.pos, strSize);
120
        INC(buffer.pos, strSize)
121
    END
122
END appends;
123
 
124
 
125
PROCEDURE eol* (buffer: tBuffer);
126
BEGIN
9073 leency 127
    appends(buffer, 0DX + 0AX, 0, 1)
8728 leency 128
END eol;
129
 
130
 
131
PROCEDURE eot* (buffer: tBuffer);
132
END eot;
133
 
134
 
135
PROCEDURE available* (): BOOLEAN;
136
VAR
137
    ptr: INTEGER;
138
    n, size, typ, x: INTEGER;
139
    res: BOOLEAN;
140
BEGIN
141
    res := FALSE;
142
    n := K.sysfunc2(54, 0);
143
    IF n > 0 THEN
144
        ptr := K.sysfunc3(54, 1, n - 1);
145
        SYSTEM.GET32(ptr, size);
146
        SYSTEM.GET32(ptr + 4, typ);
147
        SYSTEM.GET(ptr + 8, x);
148
        res := (typ = TTEXT) & (x = 1);
149
        free(ptr)
150
    END
151
    RETURN res
152
END available;
153
 
154
 
155
PROCEDURE get* (VAR cnt: INTEGER): INTEGER;
156
VAR
157
    ptr: INTEGER;
158
BEGIN
159
    ptr := 0;
160
    cnt := 0;
161
    IF available() THEN
162
        ptr := K.sysfunc3(54, 1, K.sysfunc2(54, 0) - 1);
163
        SYSTEM.GET32(ptr, cnt);
164
        DEC(cnt, 12);
165
        INC(ptr, 12)
166
    END
167
    RETURN ptr
168
END get;
169
 
170
 
171
END Clipboard.