Subversion Repositories Kolibri OS

Rev

Rev 9174 | Rev 9560 | 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
 
9448 akron1 22
IMPORT SYSTEM, KOSAPI, E := Encodings, Lines, K := KolibriOS;
8728 leency 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
9448 akron1 38
    ptr := KOSAPI.free(ptr)
8728 leency 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;
9448 akron1 55
    a := KOSAPI.malloc(size);
8728 leency 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);
9448 akron1 73
    K.CBDelSlot;
74
    K.CBWrite(size, a)
8728 leency 75
END put;
76
 
77
 
78
PROCEDURE create* (bufSize: INTEGER): tBuffer;
79
VAR
80
    res: tBuffer;
81
BEGIN
82
    NEW(res);
9448 akron1 83
    res.dataPtr := KOSAPI.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
8728 leency 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;
9448 akron1 142
    n := K.CBCount();
8728 leency 143
    IF n > 0 THEN
9448 akron1 144
        ptr := K.CBRead(n - 1);
8728 leency 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
9448 akron1 162
        ptr := K.CBRead(K.CBCount() - 1);
8728 leency 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.