Subversion Repositories Kolibri OS

Rev

Rev 8728 | Rev 9174 | 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;
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
BEGIN
9073 leency 122
    appends(buffer, 0DX + 0AX, 0, 1)
8728 leency 123
END eol;
124
 
125
 
126
PROCEDURE eot* (buffer: tBuffer);
127
END eot;
128
 
129
 
130
PROCEDURE available* (): BOOLEAN;
131
VAR
132
    ptr: INTEGER;
133
    n, size, typ, x: INTEGER;
134
    res: BOOLEAN;
135
BEGIN
136
    res := FALSE;
137
    n := K.sysfunc2(54, 0);
138
    IF n > 0 THEN
139
        ptr := K.sysfunc3(54, 1, n - 1);
140
        SYSTEM.GET32(ptr, size);
141
        SYSTEM.GET32(ptr + 4, typ);
142
        SYSTEM.GET(ptr + 8, x);
143
        res := (typ = TTEXT) & (x = 1);
144
        free(ptr)
145
    END
146
    RETURN res
147
END available;
148
 
149
 
150
PROCEDURE get* (VAR cnt: INTEGER): INTEGER;
151
VAR
152
    ptr: INTEGER;
153
BEGIN
154
    ptr := 0;
155
    cnt := 0;
156
    IF available() THEN
157
        ptr := K.sysfunc3(54, 1, K.sysfunc2(54, 0) - 1);
158
        SYSTEM.GET32(ptr, cnt);
159
        DEC(cnt, 12);
160
        INC(ptr, 12)
161
    END
162
    RETURN ptr
163
END get;
164
 
165
 
166
END Clipboard.