Subversion Repositories Kolibri OS

Rev

Rev 9073 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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 <http://www.gnu.org/licenses/>.
  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.