Subversion Repositories Kolibri OS

Rev

Rev 9073 | Rev 9560 | 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.     TAB = 9X;
  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
  38.     ptr := K.free(ptr)
  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;
  55.     a := K.malloc(size);
  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);
  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;
  69.         INC(ptr, 2);
  70.         DEC(cnt)
  71.     END;
  72.     SYSTEM.PUT32(a, size);
  73.     K.sysfunc2(54, 3);
  74.     K.sysfunc4(54, 2, size, a)
  75. END put;
  76.  
  77.  
  78. PROCEDURE create* (bufSize: INTEGER): tBuffer;
  79. VAR
  80.     res: tBuffer;
  81. BEGIN
  82.     NEW(res);
  83.     res.dataPtr := K.malloc(bufSize*SYSTEM.SIZE(WCHAR) + 4096);
  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
  127.     appends(buffer, 0DX + 0AX, 0, 1)
  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;
  142.     n := K.sysfunc2(54, 0);
  143.     IF n > 0 THEN
  144.         ptr := K.sysfunc3(54, 1, n - 1);
  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
  162.         ptr := K.sysfunc3(54, 1, K.sysfunc2(54, 0) - 1);
  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.