Subversion Repositories Kolibri OS

Rev

Rev 9073 | Go to most recent revision | Details | 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;
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
37
    ptr := K.free(ptr)
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
52
    cnt := bufSize(buffer) DIV 2;
53
    size := cnt + 12;
54
    a := K.malloc(size);
55
    ASSERT(a # 0);
56
    SYSTEM.PUT32(a, size);
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);
63
        SYSTEM.PUT(pchar, CHR(E.UNI[ORD(wch), E.CP866] MOD 256));
64
        INC(pchar);
65
        INC(ptr, 2);
66
        DEC(cnt)
67
    END;
68
    K.sysfunc2(54, 3);
69
    K.sysfunc4(54, 2, size, a)
70
END put;
71
 
72
 
73
PROCEDURE create* (bufSize: INTEGER): tBuffer;
74
VAR
75
    res: tBuffer;
76
BEGIN
77
    NEW(res);
78
    res.dataPtr := K.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
79
    ASSERT(res.dataPtr # 0);
80
    res.pos := res.dataPtr
81
    RETURN res
82
END create;
83
 
84
 
85
PROCEDURE destroy* (VAR buffer: tBuffer);
86
BEGIN
87
    IF buffer # NIL THEN
88
        IF buffer.dataPtr # 0 THEN
89
            free(buffer.dataPtr)
90
        END;
91
        DISPOSE(buffer)
92
    END
93
END destroy;
94
 
95
 
96
PROCEDURE append* (buffer: tBuffer; line: Lines.tLine; first, last: INTEGER);
97
VAR
98
    strSize: INTEGER;
99
BEGIN
100
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
101
    IF strSize > 0 THEN
102
        SYSTEM.MOVE(Lines.getPChar(line, first), buffer.pos, strSize);
103
        INC(buffer.pos, strSize)
104
    END
105
END append;
106
 
107
 
108
PROCEDURE appends* (buffer: tBuffer; s: ARRAY OF WCHAR; first, last: INTEGER);
109
VAR
110
    strSize: INTEGER;
111
BEGIN
112
    strSize := (last - first + 1)*SYSTEM.SIZE(WCHAR);
113
    IF strSize > 0 THEN
114
        SYSTEM.MOVE(SYSTEM.ADR(s[first]), buffer.pos, strSize);
115
        INC(buffer.pos, strSize)
116
    END
117
END appends;
118
 
119
 
120
PROCEDURE eol* (buffer: tBuffer);
121
VAR
122
    s: ARRAY 2 OF WCHAR;
123
BEGIN
124
    s[0] := 0DX; s[1] := 0AX;
125
    appends(buffer, s, 0, 1)
126
END eol;
127
 
128
 
129
PROCEDURE eot* (buffer: tBuffer);
130
END eot;
131
 
132
 
133
PROCEDURE available* (): BOOLEAN;
134
VAR
135
    ptr: INTEGER;
136
    n, size, typ, x: INTEGER;
137
    res: BOOLEAN;
138
BEGIN
139
    res := FALSE;
140
    n := K.sysfunc2(54, 0);
141
    IF n > 0 THEN
142
        ptr := K.sysfunc3(54, 1, n - 1);
143
        SYSTEM.GET32(ptr, size);
144
        SYSTEM.GET32(ptr + 4, typ);
145
        SYSTEM.GET(ptr + 8, x);
146
        res := (typ = TTEXT) & (x = 1);
147
        free(ptr)
148
    END
149
    RETURN res
150
END available;
151
 
152
 
153
PROCEDURE get* (VAR cnt: INTEGER): INTEGER;
154
VAR
155
    ptr: INTEGER;
156
BEGIN
157
    ptr := 0;
158
    cnt := 0;
159
    IF available() THEN
160
        ptr := K.sysfunc3(54, 1, K.sysfunc2(54, 0) - 1);
161
        SYSTEM.GET32(ptr, cnt);
162
        DEC(cnt, 12);
163
        INC(ptr, 12)
164
    END
165
    RETURN ptr
166
END get;
167
 
168
 
169
END Clipboard.