Subversion Repositories Kolibri OS

Rev

Rev 9560 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8728 leency 1
(*
9560 akron1 2
    Copyright 2021, 2022 Anton Krotov
8728 leency 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
 
9448 akron1 22
IMPORT SYSTEM, KOSAPI, E := Encodings, Lines, K := KolibriOS;
8728 leency 23
 
24
CONST
25
    TTEXT = 0;
26
    lenEOL* = 2;
27
 
28
TYPE
29
    tBuffer* = POINTER TO RECORD
30
        dataPtr*: INTEGER;
31
        pos: INTEGER
32
    END;
33
 
34
 
35
PROCEDURE free (ptr: INTEGER);
36
BEGIN
9448 akron1 37
    ptr := KOSAPI.free(ptr)
8728 leency 38
END free;
39
 
40
 
41
PROCEDURE bufSize* (buffer: tBuffer): INTEGER;
42
    RETURN buffer.pos - buffer.dataPtr
43
END bufSize;
44
 
45
 
46
PROCEDURE put* (buffer: tBuffer);
47
VAR
48
    a, cnt, size: INTEGER;
49
    ptr, pchar: INTEGER;
50
    wch: WCHAR;
51
BEGIN
9599 akron1 52
    cnt := bufSize(buffer) DIV SYSTEM.SIZE(WCHAR);
8728 leency 53
    size := cnt + 12;
9448 akron1 54
    a := KOSAPI.malloc(size);
8728 leency 55
    ASSERT(a # 0);
56
    SYSTEM.PUT32(a + 4, TTEXT);
57
    SYSTEM.PUT32(a + 8, 1);
58
    pchar := a + 12;
59
    ptr := buffer.dataPtr;
60
    WHILE cnt > 0 DO
61
        SYSTEM.GET(ptr, wch);
9560 akron1 62
        IF wch = Lines.TAB1 THEN
63
        	DEC(size)
64
        ELSIF wch = Lines.NUL THEN
65
            SYSTEM.PUT(pchar, 0X);
66
            INC(pchar)
67
        ELSE
9174 akron1 68
            SYSTEM.PUT(pchar, CHR(E.UNI[ORD(wch), E.CP866] MOD 256));
69
            INC(pchar)
70
        END;
8728 leency 71
        INC(ptr, 2);
72
        DEC(cnt)
73
    END;
9174 akron1 74
    SYSTEM.PUT32(a, size);
9448 akron1 75
    K.CBDelSlot;
76
    K.CBWrite(size, a)
8728 leency 77
END put;
78
 
79
 
80
PROCEDURE create* (bufSize: INTEGER): tBuffer;
81
VAR
82
    res: tBuffer;
83
BEGIN
84
    NEW(res);
9448 akron1 85
    res.dataPtr := KOSAPI.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
8728 leency 86
    ASSERT(res.dataPtr # 0);
87
    res.pos := res.dataPtr
88
    RETURN res
89
END create;
90
 
91
 
92
PROCEDURE destroy* (VAR buffer: tBuffer);
93
BEGIN
94
    IF buffer # NIL THEN
95
        IF buffer.dataPtr # 0 THEN
96
            free(buffer.dataPtr)
97
        END;
98
        DISPOSE(buffer)
99
    END
100
END destroy;
101
 
102
 
103
PROCEDURE append* (buffer: tBuffer; line: Lines.tLine; first, last: INTEGER);
104
VAR
105
    strSize: INTEGER;
106
BEGIN
107
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
108
    IF strSize > 0 THEN
109
        SYSTEM.MOVE(Lines.getPChar(line, first), buffer.pos, strSize);
110
        INC(buffer.pos, strSize)
111
    END
112
END append;
113
 
114
 
115
PROCEDURE appends* (buffer: tBuffer; s: ARRAY OF WCHAR; first, last: INTEGER);
116
VAR
117
    strSize: INTEGER;
118
BEGIN
119
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
120
    IF strSize > 0 THEN
121
        SYSTEM.MOVE(SYSTEM.ADR(s[first]), buffer.pos, strSize);
122
        INC(buffer.pos, strSize)
123
    END
124
END appends;
125
 
126
 
127
PROCEDURE eol* (buffer: tBuffer);
128
BEGIN
9073 leency 129
    appends(buffer, 0DX + 0AX, 0, 1)
8728 leency 130
END eol;
131
 
132
 
133
PROCEDURE eot* (buffer: tBuffer);
134
END eot;
135
 
136
 
137
PROCEDURE available* (): BOOLEAN;
138
VAR
139
    ptr: INTEGER;
140
    n, size, typ, x: INTEGER;
141
    res: BOOLEAN;
142
BEGIN
143
    res := FALSE;
9448 akron1 144
    n := K.CBCount();
8728 leency 145
    IF n > 0 THEN
9448 akron1 146
        ptr := K.CBRead(n - 1);
8728 leency 147
        SYSTEM.GET32(ptr, size);
148
        SYSTEM.GET32(ptr + 4, typ);
149
        SYSTEM.GET(ptr + 8, x);
150
        res := (typ = TTEXT) & (x = 1);
151
        free(ptr)
152
    END
153
    RETURN res
154
END available;
155
 
156
 
157
PROCEDURE get* (VAR cnt: INTEGER): INTEGER;
158
VAR
159
    ptr: INTEGER;
160
BEGIN
161
    ptr := 0;
162
    cnt := 0;
163
    IF available() THEN
9448 akron1 164
        ptr := K.CBRead(K.CBCount() - 1);
8728 leency 165
        SYSTEM.GET32(ptr, cnt);
166
        DEC(cnt, 12);
167
        INC(ptr, 12)
168
    END
169
    RETURN ptr
170
END get;
171
 
172
 
173
END Clipboard.