Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2021, 2022 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 <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE Clipboard;
  21.  
  22. IMPORT SYSTEM, KOSAPI, E := Encodings, Lines, K := KolibriOS;
  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 := KOSAPI.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 SYSTEM.SIZE(WCHAR);
  53.     size := cnt + 12;
  54.     a := KOSAPI.malloc(size);
  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);
  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
  68.             SYSTEM.PUT(pchar, CHR(E.UNI[ORD(wch), E.CP866] MOD 256));
  69.             INC(pchar)
  70.         END;
  71.         INC(ptr, 2);
  72.         DEC(cnt)
  73.     END;
  74.     SYSTEM.PUT32(a, size);
  75.     K.CBDelSlot;
  76.     K.CBWrite(size, a)
  77. END put;
  78.  
  79.  
  80. PROCEDURE create* (bufSize: INTEGER): tBuffer;
  81. VAR
  82.     res: tBuffer;
  83. BEGIN
  84.     NEW(res);
  85.     res.dataPtr := KOSAPI.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
  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
  129.     appends(buffer, 0DX + 0AX, 0, 1)
  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;
  144.     n := K.CBCount();
  145.     IF n > 0 THEN
  146.         ptr := K.CBRead(n - 1);
  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
  164.         ptr := K.CBRead(K.CBCount() - 1);
  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.