From c327661fd882aa33a5b0e569c44e69954a0d0b29 Mon Sep 17 00:00:00 2001 From: Anton Krotov Date: Thu, 20 Jan 2022 17:15:39 +0000 Subject: [PATCH] CEdit: refactoring, minor fixes git-svn-id: svn://kolibrios.org@9659 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/cedit/CEDIT | Bin 31094 -> 30603 bytes programs/develop/cedit/SRC/CEdit.ob07 | 59 +++--- programs/develop/cedit/SRC/CheckBox.ob07 | 23 ++- programs/develop/cedit/SRC/EditBox.ob07 | 63 ++++--- programs/develop/cedit/SRC/Encodings.ob07 | 36 ++-- programs/develop/cedit/SRC/Icons.ob07 | 151 +++++++++------- programs/develop/cedit/SRC/Languages.ob07 | 21 +-- programs/develop/cedit/SRC/Lines.ob07 | 10 +- programs/develop/cedit/SRC/Menu.ob07 | 1 - programs/develop/cedit/SRC/RW.ob07 | 92 ++++------ programs/develop/cedit/SRC/Search.ob07 | 20 +-- programs/develop/cedit/SRC/Text.ob07 | 210 ++++++++++------------ programs/develop/cedit/SRC/Utils.ob07 | 39 ++-- programs/develop/cedit/SRC/libimg.ob07 | 97 ---------- programs/develop/cedit/SRC/scroll.ob07 | 38 ++-- 15 files changed, 374 insertions(+), 486 deletions(-) delete mode 100644 programs/develop/cedit/SRC/libimg.ob07 diff --git a/programs/develop/cedit/CEDIT b/programs/develop/cedit/CEDIT index 9acb73ce8da446e47dddbdf5cbf3842613ff6d10..8722fe8fa3a1bb83f6885e4642855f29ce42a124 100644 GIT binary patch literal 30603 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 NjS_DZ0N)D$00#!kc4q(p diff --git a/programs/develop/cedit/SRC/CEdit.ob07 b/programs/develop/cedit/SRC/CEdit.ob07 index bb3e3428d7..695d176757 100644 --- a/programs/develop/cedit/SRC/CEdit.ob07 +++ b/programs/develop/cedit/SRC/CEdit.ob07 @@ -28,7 +28,7 @@ IMPORT RW, Ini, EB := EditBox, Tabs, Toolbar, SB := StatusBar; CONST - HEADER = "CEdit (18-jan-2022)"; + HEADER = "CEdit (20-jan-2022)"; ShellFilter = ""; EditFilter = "SH|INC|TXT|ASM|OB07|C|CPP|H|PAS|PP|LUA|INI|JSON"; @@ -354,7 +354,7 @@ BEGIN SB.setWidth(canvas.width + scrollWidth); SB.setPos(line, col); SB.setSel(chars, lines); - SB.setEnc(RW.eolNames[T.getEol(text)], E.names[T.getEnc(text)]); + SB.setEnc(E.eolNames[T.getEol(text)], E.names[T.getEnc(text)]); SB.draw(LEFT, height - BOTTOM + scrollWidth - 1); Tabs.modify(tabs, getIdx(text), text.modified) END Status; @@ -833,19 +833,19 @@ BEGIN END createSearchForm; -PROCEDURE EditBox_GetValue (edit: EB.tEditBox; VAR s: ARRAY OF WCHAR); +PROCEDURE EditBox_Get (edit: EB.tEditBox; VAR s: ARRAY OF WCHAR); VAR str: ARRAY EDITBOX_MAXCHARS + 1 OF CHAR; i: INTEGER; BEGIN - EB.getValue(edit, str); + EB.get(edit, str); i := 0; WHILE str[i] # 0X DO s[i] := WCHR(E.cp866[ORD(str[i])]); INC(i) END; s[i] := 0X -END EditBox_GetValue; +END EditBox_Get; PROCEDURE Search; @@ -927,7 +927,7 @@ PROCEDURE goto; VAR gotoVal: INTEGER; BEGIN - EditBox_GetValue(GotoEdit, gotoText); + EditBox_Get(GotoEdit, gotoText); IF U.str2int(gotoText, gotoVal) & T.goto(text, gotoVal) THEN SetFocus(GotoEdit, FALSE) END @@ -957,7 +957,7 @@ BEGIN END; IF new_searchText[i] = 0X THEN searchText := new_searchText; - EB.setValue(FindEdit, searchText); + EB.set(FindEdit, searchText); notFound := ~T.search(text, searchText, cs, whole); END END @@ -1077,9 +1077,9 @@ BEGIN Menu.setEnabled(subCase, menuUpper, selected); Menu.setEnabled(subCase, menuLower, selected); - Menu.option(subEOL, menuCRLF, T.getEol(text) = RW.EOL_CRLF); - Menu.option(subEOL, menuLF, T.getEol(text) = RW.EOL_LF); - Menu.option(subEOL, menuCR, T.getEol(text) = RW.EOL_CR); + Menu.option(subEOL, menuCRLF, T.getEol(text) = E.EOL_CRLF); + Menu.option(subEOL, menuLF, T.getEol(text) = E.EOL_LF); + Menu.option(subEOL, menuCR, T.getEol(text) = E.EOL_CR); IF menu # NIL THEN timerEnabled := FALSE; @@ -1209,11 +1209,11 @@ BEGIN |menuWin1251: T.setEnc(text, E.W1251) |menuLF: - T.setEol(text, RW.EOL_LF) + T.setEol(text, E.EOL_LF) |menuCRLF: - T.setEol(text, RW.EOL_CRLF) + T.setEol(text, E.EOL_CRLF) |menuCR: - T.setEol(text, RW.EOL_CR) + T.setEol(text, E.EOL_CR) |menuPipet: K.Run("/sys/develop/pipet", "") |menuMagnify: @@ -1344,9 +1344,9 @@ VAR menu: List.tList; BEGIN menu := List.create(NIL); - Menu.AddMenuItem(menu, menuCRLF, RW.eolNames[RW.EOL_CRLF]); - Menu.AddMenuItem(menu, menuLF, RW.eolNames[RW.EOL_LF]); - Menu.AddMenuItem(menu, menuCR, RW.eolNames[RW.EOL_CR]); + Menu.AddMenuItem(menu, menuCRLF, E.eolNames[E.EOL_CRLF]); + Menu.AddMenuItem(menu, menuLF, E.eolNames[E.EOL_LF]); + Menu.AddMenuItem(menu, menuCR, E.eolNames[E.EOL_CR]); RETURN Menu.create(menu) END CreateMenuEOL; @@ -1591,7 +1591,7 @@ BEGIN SetFocus(ReplaceEdit, TRUE) ELSE EB.key(FindEdit, key); - EditBox_GetValue(FindEdit, new_searchText); + EditBox_Get(FindEdit, new_searchText); IF new_searchText # searchText THEN searchText := new_searchText; notFound := ~T.search(text, searchText, cs, whole) @@ -1602,7 +1602,7 @@ BEGIN SetFocus(GotoEdit, TRUE) ELSE EB.key(ReplaceEdit, key); - EditBox_GetValue(ReplaceEdit, replaceText) + EditBox_Get(ReplaceEdit, replaceText) END ELSIF EditBox_Focus(GotoEdit) THEN IF keyCode = 15 THEN (* Tab *) @@ -1886,11 +1886,9 @@ BEGIN cliHeight := height; resize; resized := TRUE - END; - K.SetEventsMask({0, 1, 2, 5, 31}) + END ELSE - SetCaption(text.fileName); - K.SetEventsMask({0, 30, 31}) + SetCaption(text.fileName) END; draw_window; IF SkinHeight # K.SkinHeight() THEN @@ -1921,6 +1919,7 @@ VAR width, height, cliWidth, cliHeight: INTEGER; resized: BOOLEAN; firstClickX, firstClickY, time, blink, i: INTEGER; + key, scr: INTEGER; BEGIN header := ""; K.GetSystemColors; @@ -2047,8 +2046,9 @@ BEGIN timerEnabled := TRUE; CursorTime := K.GetTickCount(); WHILE TRUE DO + CurrentTime := K.GetTickCount(); - IF (CurrentTime - CursorTime > blink) & (blink > 0) & timerEnabled THEN + IF (CurrentTime - CursorTime > blink) & (blink > 0) & timerEnabled & ~K.RolledUp() THEN CursorTime := CurrentTime; T.toggleCursor; repaint @@ -2057,9 +2057,18 @@ BEGIN CASE K.EventTimeout(10) OF |0: |1: Redraw(resized, width, height, cliWidth, cliHeight) - |2: KeyDown(K.GetKey()) + |2: + key := K.GetKey(); + IF ~K.RolledUp() THEN + KeyDown(key) + END |3: BtnClick - |6: MouseEvent(resized, firstClickX, firstClickY, time) + |6: + IF ~K.RolledUp() THEN + MouseEvent(resized, firstClickX, firstClickY, time) + ELSE + scr := K.Scroll() + END END END END main; diff --git a/programs/develop/cedit/SRC/CheckBox.ob07 b/programs/develop/cedit/SRC/CheckBox.ob07 index a492fbbdd4..f7486bc389 100644 --- a/programs/develop/cedit/SRC/CheckBox.ob07 +++ b/programs/develop/cedit/SRC/CheckBox.ob07 @@ -34,7 +34,6 @@ TYPE tCheckBox* = RECORD left*, top*: INTEGER; - width, height: INTEGER; value*, mouse: BOOLEAN; text: ARRAY 32 OF WCHAR; canvas: G.tCanvas @@ -56,14 +55,14 @@ BEGIN G.Rect(canvas, 0, 0, fontHeight - 1, fontHeight - 1); IF chkbox.value THEN G.SetColor(canvas, fColor); - G.DLine(canvas, 2, 6, 6, -1); - G.DLine(canvas, 2, 6, 7, -1); - G.DLine(canvas, 7, 13, 9, 1); - G.DLine(canvas, 7, 13, 10, 1); - G.DLine(canvas, 2, 6, 8, -1); - G.DLine(canvas, 7, 13, 11, 1); - G.DLine(canvas, 2, 6, 5, -1); - G.DLine(canvas, 7, 13, 8, 1); + G.DLine(canvas, 2, 6, 6, -1); + G.DLine(canvas, 2, 6, 7, -1); + G.DLine(canvas, 7, 13, 9, 1); + G.DLine(canvas, 7, 13, 10, 1); + G.DLine(canvas, 2, 6, 8, -1); + G.DLine(canvas, 7, 13, 11, 1); + G.DLine(canvas, 2, 6, 5, -1); + G.DLine(canvas, 7, 13, 8, 1); END; G.SetTextColor(canvas, K.colors.work_text); G.SetBkColor(canvas, K.colors.work); @@ -84,8 +83,6 @@ BEGIN COPY(text, res.text); res.canvas := G.CreateCanvas(fontHeight + padding + LENGTH(res.text)*fontWidth, fontHeight + 1); G.SetFont(res.canvas, G.CreateFont(1, "", {})); - res.width := res.canvas.width; - res.height := res.canvas.height; chkbox := res END create; @@ -101,8 +98,8 @@ BEGIN DEC(x, chkbox.left); DEC(y, chkbox.top); chkbox.mouse := TRUE; - IF U.between(0, x, chkbox.width - 1) & U.between(0, y, chkbox.height - 1) THEN - chkbox.value := ~chkbox.value; + IF U.between(0, x, chkbox.canvas.width - 1) & U.between(0, y, chkbox.canvas.height - 1) THEN + chkbox.value := ~chkbox.value END; draw(chkbox) END diff --git a/programs/develop/cedit/SRC/EditBox.ob07 b/programs/develop/cedit/SRC/EditBox.ob07 index 38624b28ff..e880aab879 100644 --- a/programs/develop/cedit/SRC/EditBox.ob07 +++ b/programs/develop/cedit/SRC/EditBox.ob07 @@ -51,28 +51,27 @@ TYPE PROCEDURE [stdcall, "box_lib.obj", "edit_box_draw"] draw* (eb: tEditBox); END; PROCEDURE [stdcall, "box_lib.obj", "edit_box_mouse"] mouse* (eb: tEditBox); END; -PROCEDURE [stdcall, "box_lib.obj", "edit_box_set_text"] _setValue (eb: tEditBox; text: INTEGER); END; +PROCEDURE [stdcall, "box_lib.obj", "edit_box_set_text"] set_text (eb: tEditBox; text: INTEGER); END; PROCEDURE [stdcall, "box_lib.obj", "edit_box_key_safe"] key* (eb: tEditBox; key: INTEGER); END; -PROCEDURE getValue* (text: tEditBox; VAR str: ARRAY OF CHAR); +PROCEDURE get* (text: tEditBox; VAR str: ARRAY OF CHAR); VAR - ptr, max, i: INTEGER; - + ptr, max, i: INTEGER; BEGIN - ptr := text.text; - max := text.max; - ASSERT(max < LEN(str)); - i := 0; - REPEAT - SYSTEM.GET(ptr, str[i]); - INC(i); - INC(ptr) - UNTIL (str[i - 1] = 0X) OR (i = max); - str[i] := 0X -END getValue; + ptr := text.text; + max := text.max; + ASSERT(max < LEN(str)); + i := 0; + REPEAT + SYSTEM.GET(ptr, str[i]); + INC(i); + INC(ptr) + UNTIL (str[i - 1] = 0X) OR (i = max); + str[i] := 0X +END get; -PROCEDURE setValue* (text: tEditBox; str: ARRAY OF WCHAR); +PROCEDURE set* (text: tEditBox; str: ARRAY OF WCHAR); VAR i: INTEGER; temp: ARRAY MAX_LENGTH OF CHAR; @@ -83,25 +82,25 @@ BEGIN temp[i] := CHR(Encodings.UNI[ORD(str[i]), Encodings.CP866] MOD 256); INC(i) UNTIL str[i - 1] = 0X; - _setValue(text, SYSTEM.ADR(temp[0])) -END setValue; + set_text(text, SYSTEM.ADR(temp[0])) +END set; -PROCEDURE create* (tlx, tly, width, max_chars: INTEGER; VAR editbox: tEditBox); +PROCEDURE create* (x, y, width, max_chars: INTEGER; VAR editbox: tEditBox); BEGIN - editbox.width := width; - editbox.left := tlx; - editbox.top := tly; - editbox.color := 0FFFFFFH; - editbox.shift_color := 06A9480H; - editbox.focus_border_color := 0; - editbox.blur_border_color := 06A9480H; - editbox.text_color := 30000000H; - editbox.max := max_chars; - editbox.text := KOSAPI.malloc(max_chars + 2); - ASSERT(editbox.text # 0); - editbox.mouse_variable := 0; - editbox.flags := {14} + editbox.width := width; + editbox.left := x; + editbox.top := y; + editbox.color := 0FFFFFFH; + editbox.shift_color := 06A9480H; + editbox.focus_border_color := 0; + editbox.blur_border_color := 06A9480H; + editbox.text_color := 30000000H; + editbox.max := max_chars; + editbox.text := KOSAPI.malloc(max_chars + 2); + ASSERT(editbox.text # 0); + editbox.mouse_variable := 0; + editbox.flags := {14} END create; diff --git a/programs/develop/cedit/SRC/Encodings.ob07 b/programs/develop/cedit/SRC/Encodings.ob07 index a99279fbbb..a986b88f41 100644 --- a/programs/develop/cedit/SRC/Encodings.ob07 +++ b/programs/develop/cedit/SRC/Encodings.ob07 @@ -1,5 +1,5 @@ (* - Copyright 2021 Anton Krotov + Copyright 2021, 2022 Anton Krotov This file is part of CEdit. @@ -20,18 +20,26 @@ MODULE Encodings; CONST - CP866* = 0; W1251* = 1; UTF8* = 2; UTF8BOM* = 3; UTF16LE* = 4; + CP866* = 0; W1251* = 1; UTF8* = 2; UTF8BOM* = 3; (*UTF16LE* = 4;*) UNDEF* = -1; + EOL_CRLF* = 0; EOL_LF* = 1; EOL_CR* = 2; + CR = 0DX; LF = 0AX; + TYPE CP = ARRAY 256 OF INTEGER; + tEOL* = ARRAY 3 OF WCHAR; + VAR cpW1251*, cp866*: CP; names*: ARRAY 4, 16 OF WCHAR; UNI*: ARRAY 65536, 2 OF INTEGER; + eol*: ARRAY 3 OF tEOL; + eolNames*: ARRAY 3, 16 OF WCHAR; + PROCEDURE InitCP (VAR cp: CP); VAR @@ -60,6 +68,10 @@ PROCEDURE InitW1251 (VAR cp: CP); VAR n, i: INTEGER; BEGIN + InitCP(cp); + FOR i := 0410H TO 044FH DO + cp[i - 350H] := i + END; n := 80H; Init8(cp, n, 0402H, 0403H, 201AH, 0453H, 201EH, 2026H, 2020H, 2021H); Init8(cp, n, 20ACH, 2030H, 0409H, 2039H, 040AH, 040CH, 040BH, 040FH); @@ -69,10 +81,6 @@ BEGIN Init8(cp, n, 0401H, 00A9H, 0404H, 00ABH, 00ACH, 00ADH, 00AEH, 0407H); Init8(cp, n, 00B0H, 00B1H, 0406H, 0456H, 0491H, 00B5H, 00B6H, 00B7H); Init8(cp, n, 0451H, 2116H, 0454H, 00BBH, 0458H, 0405H, 0455H, 0457H); - FOR i := 0410H TO 044FH DO - cp[i - 350H] := i - END; - InitCP(cp) END InitW1251; @@ -80,11 +88,12 @@ PROCEDURE InitCP866 (VAR cp: CP); VAR n, i: INTEGER; BEGIN + InitCP(cp); FOR i := 0410H TO 043FH DO - cp[i - 0410H + 80H] := i + cp[i - 390H] := i END; FOR i := 0440H TO 044FH DO - cp[i - 0440H + 0E0H] := i + cp[i - 360H] := i END; n := 0B0H; Init8(cp, n, 2591H, 2592H, 2593H, 2502H, 2524H, 2561H, 2562H, 2556H); @@ -93,12 +102,9 @@ BEGIN Init8(cp, n, 255AH, 2554H, 2569H, 2566H, 2560H, 2550H, 256CH, 2567H); Init8(cp, n, 2568H, 2564H, 2565H, 2559H, 2558H, 2552H, 2553H, 256BH); Init8(cp, n, 256AH, 2518H, 250CH, 2588H, 2584H, 258CH, 2590H, 2580H); - n := 0F0H; Init8(cp, n, 0401H, 0451H, 0404H, 0454H, 0407H, 0457H, 040EH, 045EH); Init8(cp, n, 00B0H, 2219H, 00B7H, 221AH, 2116H, 00A4H, 25A0H, 00A0H); - - InitCP(cp) END InitCP866; @@ -108,7 +114,7 @@ VAR BEGIN FOR i := 0 TO 65535 DO UNI[i, CP866] := UNDEF; - UNI[i, W1251] := UNDEF; + UNI[i, W1251] := UNDEF END; FOR i := 0 TO 255 DO IF cpW1251[i] # UNDEF THEN @@ -122,6 +128,12 @@ END setUNI; BEGIN + eol[EOL_CRLF] := CR + LF; + eol[EOL_LF] := LF; + eol[EOL_CR] := CR; + eolNames[EOL_CRLF] := "CRLF"; + eolNames[EOL_LF] := "LF"; + eolNames[EOL_CR] := "CR"; names[CP866] := "CP866"; names[W1251] := "Windows-1251"; names[UTF8] := "UTF-8"; diff --git a/programs/develop/cedit/SRC/Icons.ob07 b/programs/develop/cedit/SRC/Icons.ob07 index efb4169b9b..ee051afdb4 100644 --- a/programs/develop/cedit/SRC/Icons.ob07 +++ b/programs/develop/cedit/SRC/Icons.ob07 @@ -20,106 +20,123 @@ MODULE Icons; IMPORT - LibImg, K := KolibriOS, Graph, SYSTEM; + Graph, File, SYSTEM, KOSAPI; CONST - fileName = "/sys/Icons16.png"; - SIZE* = 18; + fileName = "/sys/Icons16.png"; + SIZE* = 18; VAR - source: INTEGER; - + source: INTEGER; +(* PROCEDURE copy (src, dst: INTEGER); VAR - src_sizeX, src_sizeY, dst_sizeX, dst_sizeY, - src_data, dst_data: INTEGER; + src_width, src_height, + dst_width, dst_height, + src_data, dst_data: INTEGER; BEGIN - LibImg.GetInf(src, src_sizeX, src_sizeY, src_data); - LibImg.GetInf(dst, dst_sizeX, dst_sizeY, dst_data); - ASSERT(src_sizeX = dst_sizeX); - ASSERT(src_sizeY = dst_sizeY); - SYSTEM.MOVE(src_data, dst_data, src_sizeX*src_sizeY*3) + LibImg.GetInf(src, src_width, src_height, src_data); + LibImg.GetInf(dst, dst_width, dst_height, dst_data); + ASSERT(src_width = dst_width); + ASSERT(src_height = dst_height); + SYSTEM.MOVE(src_data, dst_data, src_width*src_height*4) END copy; +*) + +PROCEDURE [stdcall, "libimg.obj", ""] img_decode (data, size, options: INTEGER): INTEGER; END; +PROCEDURE [stdcall, "Libimg.obj", ""] img_convert (src, dst, dst_type, flags, param: INTEGER): INTEGER; END; +PROCEDURE [stdcall, "Libimg.obj", ""] img_destroy (img: INTEGER); END; + +PROCEDURE GetInf (img: INTEGER; VAR width, height, data: INTEGER); +BEGIN + SYSTEM.GET(img + 4, width); + SYSTEM.GET(img + 8, height); + SYSTEM.GET(img + 24, data); +END GetInf; + + +PROCEDURE GetImg* (ptr, size: INTEGER): INTEGER; +VAR + image_data, dst, x, type: INTEGER; +BEGIN + image_data := img_decode(ptr, size, 0); + IF image_data # 0 THEN + SYSTEM.GET(image_data + 4, x); + ASSERT(x = SIZE); + SYSTEM.GET(image_data + 20, type); + IF type # 3 THEN + dst := img_convert(image_data, 0, 3, 0, 0); + img_destroy(image_data); + image_data := dst + END + END + RETURN image_data +END GetImg; PROCEDURE load (): INTEGER; VAR - y: INTEGER; + size, res, ptr: INTEGER; BEGIN - RETURN LibImg.LoadFromFile(fileName, SIZE, y) + res := 0; + ptr := File.Load(fileName, size); + IF ptr # 0 THEN + res := GetImg(ptr, size); + ptr := KOSAPI.free(ptr) + END + RETURN res END load; PROCEDURE draw* (icons, n, x, y: INTEGER); VAR - sizeX, sizeY, data: INTEGER; + width, height, data: INTEGER; BEGIN - LibImg.GetInf(icons, sizeX, sizeY, data); - K.DrawImage(data + SIZE*SIZE*3*n, SIZE, SIZE, x, y) + GetInf(icons, width, height, data); + KOSAPI.sysfunc7(65, data + SIZE*SIZE*4*n, SIZE*65536 + SIZE, x*65536 + y, 32, 0, 0) END draw; -PROCEDURE gray (icons: INTEGER); -VAR - sizeX, sizeY, data, x, y: INTEGER; - b, g, r, gr: BYTE; -BEGIN - LibImg.GetInf(icons, sizeX, sizeY, data); - FOR y := 0 TO sizeY - 1 DO - FOR x := 0 TO sizeX - 1 DO - SYSTEM.GET8(data, b); - SYSTEM.GET8(data + 1, g); - SYSTEM.GET8(data + 2, r); - gr := (r + g + b) DIV 3; - SYSTEM.PUT8(data, gr); - SYSTEM.PUT8(data + 1, gr); - SYSTEM.PUT8(data + 2, gr); - INC(data, 3); - END - END -END gray; - - PROCEDURE iconsBackColor (icons: INTEGER; BackColor: INTEGER); VAR - sizeX, sizeY, data, x, y: INTEGER; - b, g, r: BYTE; + width, height, data, x, y, pix: INTEGER; + b, g, r, gr: BYTE; BEGIN - LibImg.GetInf(icons, sizeX, sizeY, data); - FOR y := 0 TO sizeY - 1 DO - FOR x := 0 TO sizeX - 1 DO - SYSTEM.GET8(data, b); - SYSTEM.GET8(data + 1, g); - SYSTEM.GET8(data + 2, r); - IF b + g + r = 765 THEN - Graph.getRGB(BackColor, r, g, b) - END; - SYSTEM.PUT8(data, b); - SYSTEM.PUT8(data + 1, g); - SYSTEM.PUT8(data + 2, r); - INC(data, 3); - END - END + GetInf(icons, width, height, data); + FOR y := 0 TO height - 1 DO + FOR x := 0 TO width - 1 DO + SYSTEM.GET32(data, pix); + Graph.getRGB(pix, r, g, b); + gr := (r + g + b) DIV 3; + IF BackColor = -1 THEN + pix := gr + 256*gr + 65536*gr + ELSIF gr = 255 THEN + pix := BackColor + END; + SYSTEM.PUT32(data, pix); + INC(data, 4) + END + END END iconsBackColor; PROCEDURE get* (VAR icons, grayIcons: INTEGER; BackColor: INTEGER); BEGIN - IF source = 0 THEN - source := load(); - icons := load(); - grayIcons := load() - ELSE - copy(source, icons); - copy(source, grayIcons) - END; - gray(grayIcons); - iconsBackColor(icons, BackColor); - iconsBackColor(grayIcons, BackColor) + IF source = 0 THEN + source := load(); + icons := load(); + grayIcons := load(); + iconsBackColor(grayIcons, -1); + iconsBackColor(grayIcons, BackColor); + iconsBackColor(icons, BackColor) + (*ELSE + copy(source, icons); + copy(source, grayIcons)*) + END; END get; BEGIN - source := 0 + source := 0 END Icons. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Languages.ob07 b/programs/develop/cedit/SRC/Languages.ob07 index 6d62b0d1eb..523474de2d 100644 --- a/programs/develop/cedit/SRC/Languages.ob07 +++ b/programs/develop/cedit/SRC/Languages.ob07 @@ -1,5 +1,5 @@ (* - Copyright 2021 Anton Krotov + Copyright 2021, 2022 Anton Krotov This file is part of CEdit. @@ -215,31 +215,18 @@ BEGIN END C; -PROCEDURE getChar (line: tLine; i: INTEGER): WCHAR; -VAR - res: WCHAR; -BEGIN - IF i >= line.length THEN - res := 0X - ELSE - res := Lines.getChar(line, i) - END - RETURN res -END getChar; - - PROCEDURE LuaLong* (line: tLine; pos: INTEGER): INTEGER; VAR res: INTEGER; BEGIN res := -1; - IF getChar(line, pos) = "[" THEN + IF Lines.getChar(line, pos) = "[" THEN INC(pos); - WHILE getChar(line, pos) = "=" DO + WHILE Lines.getChar(line, pos) = "=" DO INC(res); INC(pos) END; - IF getChar(line, pos) = "[" THEN + IF Lines.getChar(line, pos) = "[" THEN INC(res) ELSE res := -1 diff --git a/programs/develop/cedit/SRC/Lines.ob07 b/programs/develop/cedit/SRC/Lines.ob07 index eeef5e62b8..2bf203dfee 100644 --- a/programs/develop/cedit/SRC/Lines.ob07 +++ b/programs/develop/cedit/SRC/Lines.ob07 @@ -184,10 +184,14 @@ END resize; PROCEDURE getChar* (line: tLine; i: INTEGER): WCHAR; VAR - c: WCHAR; + res: WCHAR; BEGIN - SYSTEM.GET(line.ptr + i*WCHAR_SIZE, c) - RETURN c + IF i >= line.length THEN + res := 0X + ELSE + SYSTEM.GET(line.ptr + i*WCHAR_SIZE, res) + END + RETURN res END getChar; diff --git a/programs/develop/cedit/SRC/Menu.ob07 b/programs/develop/cedit/SRC/Menu.ob07 index 247ef2920b..1b72a1f491 100644 --- a/programs/develop/cedit/SRC/Menu.ob07 +++ b/programs/develop/cedit/SRC/Menu.ob07 @@ -88,7 +88,6 @@ TYPE key, MenuItem: INTEGER END; - tClick = PROCEDURE (menu: tMenu; id: INTEGER); tProc = PROCEDURE; VAR diff --git a/programs/develop/cedit/SRC/RW.ob07 b/programs/develop/cedit/SRC/RW.ob07 index dfc25afe2a..4bff3c8efe 100644 --- a/programs/develop/cedit/SRC/RW.ob07 +++ b/programs/develop/cedit/SRC/RW.ob07 @@ -33,15 +33,11 @@ CONST NAME_LEN = 1024; - EOL_CRLF* = 0; EOL_LF* = 1; EOL_CR* = 2; - TYPE tFileName* = ARRAY NAME_LEN OF CHAR; - tEOL = ARRAY 3 OF WCHAR; - tInput* = POINTER TO RECORD buffer: INTEGER; strBuf: Lines.tLine; @@ -55,18 +51,12 @@ TYPE handle: File.FS; buffer: ARRAY BUF_SIZE OF BYTE; pos: INTEGER; - eol: tEOL; + eol: E.tEOL; putChar: PROCEDURE (file: tOutput; code: INTEGER); error: BOOLEAN END; -VAR - - eol*: ARRAY 3 OF tEOL; - eolNames*: ARRAY 3, 16 OF WCHAR; - - PROCEDURE getByte (file: tInput): BYTE; VAR res: BYTE; @@ -109,7 +99,9 @@ BEGIN ELSIF (0E0H <= b) & (b <= 0EFH) THEN DEC(b, 0E0H); n := 2 - ELSIF (0F0H <= b) & (b <= 0F7H) THEN + ELSE + n := -1 +(* ELSIF (0F0H <= b) & (b <= 0F7H) THEN DEC(b, 0F0H); n := 3 ELSIF (0F8H <= b) & (b <= 0FBH) THEN @@ -124,15 +116,15 @@ BEGIN ELSIF b = 0FFH THEN n := -1 ELSIF (080H <= b) & (b <= 0BFH) THEN - n := -1 + n := -1*) END; code := b; - +(* IF n > 2 THEN n := -1 END; - +*) WHILE n > 0 DO DEC(n); b := peakByte(file); @@ -160,11 +152,11 @@ PROCEDURE getCharCP866 (file: tInput): INTEGER; RETURN E.cp866[getByte(file)] END getCharCP866; - +(* PROCEDURE getCharUTF16LE (file: tInput): INTEGER; RETURN getByte(file) + getByte(file) * 256 END getCharUTF16LE; - +*) PROCEDURE getString* (file: tInput; line: Lines.tLine; tabs: BOOLEAN; VAR eol: BOOLEAN): INTEGER; VAR @@ -299,20 +291,20 @@ BEGIN cnt := text.cnt; WHILE (text.cnt > 0) & (res = -1) DO c := text.getChar(text); - IF c = 10 THEN - res := EOL_LF - ELSIF c = 13 THEN - IF text.getChar(text) = 10 THEN - res := EOL_CRLF + IF CHR(c) = LF THEN + res := E.EOL_LF + ELSIF CHR(c) = CR THEN + IF CHR(text.getChar(text)) = LF THEN + res := E.EOL_CRLF ELSE - res := EOL_CR + res := E.EOL_CR END END END; text.cnt := cnt; text.pos := pos; IF res = -1 THEN - res := EOL_CRLF + res := E.EOL_CRLF END RETURN res END detectEOL; @@ -373,7 +365,7 @@ BEGIN DISPOSE(res) ELSE enc := detectEncoding(res); - IF (enc = E.UTF8BOM) OR (enc = E.UTF8) THEN + IF enc IN {E.UTF8BOM, E.UTF8} THEN res.getChar := getCharUTF8 ELSIF enc = E.CP866 THEN res.getChar := getCharCP866 @@ -427,11 +419,9 @@ VAR BEGIN FOR i := 0 TO n - 1 DO c := Lines.getChar(line, i); - IF c = Lines.TAB1 THEN - (* nothing to do *) - ELSIF c = Lines.NUL THEN + IF c = Lines.NUL THEN file.putChar(file, 0) - ELSE + ELSIF c # Lines.TAB1 THEN file.putChar(file, ORD(c)) END END @@ -467,32 +457,31 @@ BEGIN END putCharUTF8; -PROCEDURE putCharW1251 (file: tOutput; code: INTEGER); +PROCEDURE putCharCP (file: tOutput; code, cp: INTEGER); VAR n: INTEGER; BEGIN - n := E.UNI[code, E.W1251]; + n := E.UNI[code, cp]; IF n # E.UNDEF THEN putByte(file, n) ELSE putByte(file, ORD("?")) END +END putCharCP; + + +PROCEDURE putCharW1251 (file: tOutput; code: INTEGER); +BEGIN + putCharCP(file, code, E.W1251) END putCharW1251; PROCEDURE putCharCP866 (file: tOutput; code: INTEGER); -VAR - n: INTEGER; BEGIN - n := E.UNI[code, E.CP866]; - IF n # E.UNDEF THEN - putByte(file, n) - ELSE - putByte(file, ORD("?")) - END + putCharCP(file, code, E.CP866) END putCharCP866; - +(* PROCEDURE putCharUTF16LE (file: tOutput; code: INTEGER); BEGIN IF ~((0 <= code) & (code <= 65535)) THEN @@ -500,7 +489,7 @@ BEGIN END; putByte(file, code MOD 256); putByte(file, code DIV 256) -END putCharUTF16LE; +END putCharUTF16LE;*) PROCEDURE close* (VAR file: tOutput): BOOLEAN; @@ -528,15 +517,15 @@ VAR BEGIN NEW(res); res.pos := 0; - res.eol := eol[nl]; + res.eol := E.eol[nl]; res.putChar := NIL; - IF (enc = E.UTF8) OR (enc = E.UTF8BOM) THEN - res.putChar := putCharUTF8; + IF enc IN {E.UTF8BOM, E.UTF8} THEN IF enc = E.UTF8BOM THEN - res.putChar(res, ORD(BOM)) - END - ELSIF enc = E.UTF16LE THEN - res.putChar := putCharUTF16LE; + putCharUTF8(res, ORD(BOM)) + END; + res.putChar := putCharUTF8 + (*ELSIF enc = E.UTF16LE THEN + res.putChar := putCharUTF16LE*) ELSIF enc = E.W1251 THEN res.putChar := putCharW1251 ELSIF enc = E.CP866 THEN @@ -568,11 +557,4 @@ BEGIN END destroy; -BEGIN - eol[EOL_CRLF] := CR + LF; - eol[EOL_LF] := LF; - eol[EOL_CR] := CR; - eolNames[EOL_CRLF] := "CRLF"; - eolNames[EOL_LF] := "LF"; - eolNames[EOL_CR] := "CR" END RW. \ No newline at end of file diff --git a/programs/develop/cedit/SRC/Search.ob07 b/programs/develop/cedit/SRC/Search.ob07 index 6b94569818..debe0353aa 100644 --- a/programs/develop/cedit/SRC/Search.ob07 +++ b/programs/develop/cedit/SRC/Search.ob07 @@ -1,5 +1,5 @@ (* - Copyright 2021 Anton Krotov + Copyright 2021, 2022 Anton Krotov This file is part of CEdit. @@ -41,7 +41,7 @@ VAR res: tBuffer; BEGIN pChar := text.dataPtr; - cnt := CB.bufSize(text) DIV 2; + cnt := CB.bufSize(text) DIV SYSTEM.SIZE(WCHAR); FOR i := 0 TO 65535 DO table[i, 1] := 0 @@ -54,15 +54,15 @@ BEGIN SYSTEM.PUT(pChar, c) END; INC(table[ORD(c), 1]); - INC(pChar, 2); + INC(pChar, SYSTEM.SIZE(WCHAR)); DEC(i) END; - res := CB.create(cnt * SYSTEM.SIZE(INTEGER)); + res := CB.create(cnt*SYSTEM.SIZE(INTEGER)); table[0, 0] := res.dataPtr; FOR i := 1 TO 65535 DO - table[i, 0] := table[i - 1, 0] + table[i - 1, 1] * SYSTEM.SIZE(INTEGER) + table[i, 0] := table[i - 1, 0] + table[i - 1, 1]*SYSTEM.SIZE(INTEGER) END; pChar := text.dataPtr; @@ -71,12 +71,12 @@ BEGIN SYSTEM.GET(pChar, c); SYSTEM.PUT(table[ORD(c), 0], i); INC(table[ORD(c), 0], SYSTEM.SIZE(INTEGER)); - INC(pChar, 2); + INC(pChar, SYSTEM.SIZE(WCHAR)); INC(i) END; FOR i := 0 TO 65535 DO - DEC(table[i, 0], table[i, 1] * SYSTEM.SIZE(INTEGER)) + DEC(table[i, 0], table[i, 1]*SYSTEM.SIZE(INTEGER)) END RETURN res @@ -96,15 +96,15 @@ BEGIN prev_item_pos := 0; WHILE k > 0 DO SYSTEM.GET(pos, x); - IF Utils.streq(text.dataPtr + x*2, SYSTEM.ADR(s[0]), n) THEN + IF Utils.streq(text.dataPtr + x*SYSTEM.SIZE(WCHAR), SYSTEM.ADR(s[0]), n) THEN flag := whole; IF flag THEN IF x > 0 THEN - SYSTEM.GET(text.dataPtr + (x - 1)*2, c1); + SYSTEM.GET(text.dataPtr + (x - 1)*SYSTEM.SIZE(WCHAR), c1); ELSE c1 := 0X END; - SYSTEM.GET(text.dataPtr + (x + n)*2, c2); + SYSTEM.GET(text.dataPtr + (x + n)*SYSTEM.SIZE(WCHAR), c2); flag := Utils.isLetter(c1) OR Utils.isLetter(c2) OR Utils.isDigit(c1) OR Utils.isDigit(c2) OR (c1 = "_") OR (c2 = "_") END; IF ~flag & (x >= prev_item_pos) THEN diff --git a/programs/develop/cedit/SRC/Text.ob07 b/programs/develop/cedit/SRC/Text.ob07 index 2099372594..17f1dae785 100644 --- a/programs/develop/cedit/SRC/Text.ob07 +++ b/programs/develop/cedit/SRC/Text.ob07 @@ -173,19 +173,6 @@ BEGIN END hideCursor; -PROCEDURE getChar (line: tLine; i: INTEGER): WCHAR; -VAR - res: WCHAR; -BEGIN - IF i >= line.length THEN - res := 0X - ELSE - res := Lines.getChar(line, i) - END - RETURN res -END getChar; - - PROCEDURE getString (src: tLine; pos, cnt: INTEGER; VAR dst: ARRAY OF WCHAR): INTEGER; VAR i: INTEGER; @@ -193,7 +180,7 @@ BEGIN i := 0; WHILE (pos < src.length) & (cnt > 0) DO IF i < LEN(dst) - 1 THEN - dst[i] := getChar(src, pos); + dst[i] := Lines.getChar(src, pos); INC(i) END; INC(pos); @@ -322,10 +309,10 @@ VAR s: ARRAY 32 OF WCHAR; color: INTEGER; BEGIN - c := getChar(line, i); + c := Lines.getChar(line, i); WHILE U.isLetter(c) OR (c = "_") OR U.isDigit(c) DO INC(i); - c := getChar(line, i); + c := Lines.getChar(line, i); END; DEC(i); lexLen := getString(line, first, i - first + 1, s); @@ -360,7 +347,7 @@ VAR End := i - 1; k := Start; WHILE k <= End DO - c := getChar(line, k); + c := Lines.getChar(line, k); IF c = "\" THEN j := k; Lang.SkipEsc(line, k, line.length - 1, text.lang); @@ -381,7 +368,7 @@ BEGIN END; cond := 0; WHILE i <= n DO - c := getChar(line, i); + c := Lines.getChar(line, i); IF lang = Lang.langFasm THEN @@ -396,17 +383,17 @@ BEGIN hex := FALSE; k := i; INC(i); - c := getChar(line, i); - IF (cap(c) = "X") & (getChar(line, i - 1) = "0") THEN + c := Lines.getChar(line, i); + IF (cap(c) = "X") & (Lines.getChar(line, i - 1) = "0") THEN INC(i); hex := TRUE END; - WHILE U.isHex(cap(getChar(line, i))) DO + WHILE U.isHex(cap(Lines.getChar(line, i))) DO INC(i) END; - IF (cap(getChar(line, i)) = "H") & ~hex THEN + IF (cap(Lines.getChar(line, i)) = "H") & ~hex THEN INC(i) END; @@ -435,13 +422,13 @@ BEGIN IF (c = "'") OR (c = '"') THEN String(text, line, i, y, backColor); ELSE - ident(text, i, i - ORD((lang = Lang.langC) & (i > 0) & (getChar(line, i - 1) = "#")), y, line, backColor, Lang.isCS(lang)) + ident(text, i, i - ORD((lang = Lang.langC) & (i > 0) & (Lines.getChar(line, i - 1) = "#")), y, line, backColor, Lang.isCS(lang)) END; IF lang = Lang.langJSON THEN - WHILE Lines.isSpace(getChar(line, i + 1)) DO + WHILE Lines.isSpace(Lines.getChar(line, i + 1)) DO INC(i) END; - IF getChar(line, i + 1) = ":" THEN + IF Lines.getChar(line, i + 1) = ":" THEN PrintLex(text, line, k, i, y, colors.key1, backColor) END END; @@ -449,15 +436,15 @@ BEGIN ELSIF U.isDigit(c) THEN k := i; INC(i); - c := getChar(line, i); + c := Lines.getChar(line, i); IF c = "." THEN DEC(i); - c := getChar(line, i) + c := Lines.getChar(line, i) END; - IF (cap(c) = "X") & (getChar(line, i - 1) = "0") THEN + IF (cap(c) = "X") & (Lines.getChar(line, i - 1) = "0") THEN REPEAT INC(i); - c := getChar(line, i) + c := Lines.getChar(line, i) UNTIL ~U.isHex(cap(c)); IF UL(c) THEN INC(i) @@ -467,27 +454,27 @@ BEGIN ELSIF U.isDigit(c) THEN REPEAT INC(i) - UNTIL ~U.isDigit(getChar(line, i)); - c := getChar(line, i); + UNTIL ~U.isDigit(Lines.getChar(line, i)); + c := Lines.getChar(line, i); IF UL(c) THEN INC(i) ELSIF c = "." THEN INC(i); - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; - c := getChar(line, i); + c := Lines.getChar(line, i); IF cap(c) = "E" THEN INC(i); - c := getChar(line, i); + c := Lines.getChar(line, i); IF (c = "+") OR (c = "-") THEN INC(i) END; - IF U.isDigit(getChar(line, i)) THEN - WHILE U.isDigit(getChar(line, i)) DO + IF U.isDigit(Lines.getChar(line, i)) THEN + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; - c := getChar(line, i); + c := Lines.getChar(line, i); IF FL(c) THEN INC(i) END @@ -531,30 +518,30 @@ BEGIN color := colors.num; k := i; INC(i); - WHILE U.isHex(getChar(line, i)) DO + WHILE U.isHex(Lines.getChar(line, i)) DO INC(i) END; IF i <= n THEN - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN INC(i); - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN DEC(i) END; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; - IF getChar(line, i) = "E" THEN + IF Lines.getChar(line, i) = "E" THEN INC(i); - IF (getChar(line, i) = "+") OR (getChar(line, i) = "-") THEN + IF (Lines.getChar(line, i) = "+") OR (Lines.getChar(line, i) = "-") THEN INC(i) END; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END END - ELSIF getChar(line, i) = "H" THEN + ELSIF Lines.getChar(line, i) = "H" THEN INC(i) - ELSIF getChar(line, i) = "X" THEN + ELSIF Lines.getChar(line, i) = "X" THEN color := colors.string; INC(i) END @@ -618,7 +605,7 @@ BEGIN cond := 0 ELSIF U.isDigit(c) THEN k := i; - IF (c = "0") & (cap(getChar(line, i + 1)) = "X") THEN + IF (c = "0") & (cap(Lines.getChar(line, i + 1)) = "X") THEN isDgt := U.isHex; hex := TRUE; INC(i, 2) @@ -626,24 +613,24 @@ BEGIN isDgt := U.isDigit; hex := FALSE END; - WHILE isDgt(cap(getChar(line, i))) DO + WHILE isDgt(cap(Lines.getChar(line, i))) DO INC(i) END; - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN INC(i); - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN DEC(i) END; - WHILE isDgt(cap(getChar(line, i))) DO + WHILE isDgt(cap(Lines.getChar(line, i))) DO INC(i) END END; - IF (cap(getChar(line, i)) = "E") OR hex & (cap(getChar(line, i)) = "P") THEN + IF (cap(Lines.getChar(line, i)) = "E") OR hex & (cap(Lines.getChar(line, i)) = "P") THEN INC(i); - IF (getChar(line, i) = "-") OR (getChar(line, i) = "+") THEN + IF (Lines.getChar(line, i) = "-") OR (Lines.getChar(line, i) = "+") THEN INC(i) END; - WHILE isDgt(cap(getChar(line, i))) DO + WHILE isDgt(cap(Lines.getChar(line, i))) DO INC(i) END END; @@ -692,7 +679,7 @@ BEGIN String(text, line, i, y, backColor); cond := 0 ELSIF c = "{" THEN - IF getChar(line, i + 1) = "$" THEN + IF Lines.getChar(line, i + 1) = "$" THEN depth := 3 ELSE depth := 1 @@ -703,21 +690,21 @@ BEGIN ELSIF c = "#" THEN k := i; INC(i); - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; DEC(i); PrintLex(text, line, k, i, y, colors.string, backColor); cond := 0 ELSIF c = "$" THEN - IF (i > 0 ) & (getChar(line, i - 1) = "#") THEN + IF (i > 0 ) & (Lines.getChar(line, i - 1) = "#") THEN color := colors.string ELSE color := colors.num END; k := i; INC(i); - WHILE U.isHex(cap(getChar(line, i))) DO + WHILE U.isHex(cap(Lines.getChar(line, i))) DO INC(i) END; DEC(i); @@ -725,23 +712,23 @@ BEGIN cond := 0 ELSIF U.isDigit(c) THEN k := i; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN INC(i); - IF getChar(line, i) = "." THEN + IF Lines.getChar(line, i) = "." THEN DEC(i) END; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; - IF cap(getChar(line, i)) = "E" THEN + IF cap(Lines.getChar(line, i)) = "E" THEN INC(i); - IF (getChar(line, i) = "-") OR (getChar(line, i) = "+") THEN + IF (Lines.getChar(line, i) = "-") OR (Lines.getChar(line, i) = "+") THEN INC(i) END; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END END @@ -784,7 +771,7 @@ BEGIN PrintComment(text, line, depth, i, 1, y, backColor) ELSIF U.isDigit(c) THEN k := i; - WHILE U.isDigit(getChar(line, i)) DO + WHILE U.isDigit(Lines.getChar(line, i)) DO INC(i) END; DEC(i); @@ -809,7 +796,7 @@ VAR i: INTEGER; BEGIN i := 0; - WHILE Lines.isSpace(getChar(line, i)) DO + WHILE Lines.isSpace(Lines.getChar(line, i)) DO INC(i) END RETURN i @@ -977,15 +964,15 @@ BEGIN END END; cursor.X := MIN(MAX(x, 0), text.curLine.length); - c := getChar(text.curLine, cursor.X); + c := Lines.getChar(text.curLine, cursor.X); IF c = TAB1 THEN n := cursor.X; - WHILE getChar(text.curLine, n) = TAB1 DO + WHILE Lines.getChar(text.curLine, n) = TAB1 DO INC(n) END; R := n - cursor.X; n := cursor.X; - WHILE getChar(text.curLine, n) # TAB DO + WHILE Lines.getChar(text.curLine, n) # TAB DO DEC(n) END; L := cursor.X - n; @@ -1078,8 +1065,8 @@ BEGIN IF i < curLine.length THEN n := i; INC(i); - IF getChar(curLine, i - 1) = TAB THEN - WHILE getChar(curLine, i) = TAB1 DO + IF Lines.getChar(curLine, i - 1) = TAB THEN + WHILE Lines.getChar(curLine, i) = TAB1 DO INC(i) END END; @@ -1105,7 +1092,7 @@ VAR pos: INTEGER; BEGIN pos := text.cursor.X + d; - WHILE getChar(text.curLine, pos) = TAB1 DO + WHILE Lines.getChar(text.curLine, pos) = TAB1 DO INC(pos, d) END; SetPos(text, pos, text.cursor.Y) @@ -1148,7 +1135,7 @@ BEGIN Lines.delCharN(curLine, 0, i); Lines.insert3(curLine, 0, k); WHILE k > 0 DO - Lines.setChar(curLine, k - 1, getChar(line2, k - 1)); + Lines.setChar(curLine, k - 1, Lines.getChar(line2, k - 1)); DEC(k) END; Lines.modify(curLine); @@ -1197,7 +1184,7 @@ BEGIN SetPos(text, n, text.cursor.Y); resetSelect(text); WHILE n > 0 DO - Lines.setChar(text.curLine, n - 1, getChar(line2, n - 1)); + Lines.setChar(text.curLine, n - 1, Lines.getChar(line2, n - 1)); DEC(n) END; Lines.modify(newLine) @@ -1464,7 +1451,7 @@ VAR BEGIN res := 0; FOR i := first TO last DO - IF getChar(line, i) # TAB1 THEN + IF Lines.getChar(line, i) # TAB1 THEN INC(res) END END @@ -1480,15 +1467,13 @@ BEGIN IF lines > 1 THEN chars := charCnt(first, selBeg.X, first.length - 1) + charCnt(last, 0, selEnd.X - 1) + lenEOL; - line := first.next(tLine) + line := first.next(tLine); + WHILE line # last DO + INC(chars, charCnt(line, 0, line.length - 1) + lenEOL); + NextLine(line) + END ELSE - chars := charCnt(first, selBeg.X, selEnd.X - 1); - line := last - END; - - WHILE line # last DO - INC(chars, charCnt(line, 0, line.length - 1) + lenEOL); - NextLine(line) + chars := charCnt(first, selBeg.X, selEnd.X - 1) END ELSE chars := 0; @@ -1572,7 +1557,7 @@ VAR res := pos; i := 0; REPEAT - c := getChar(line, i); + c := Lines.getChar(line, i); IF c = TAB THEN INC(res, Lines.tab - res MOD Lines.tab) ELSIF c # TAB1 THEN @@ -1707,7 +1692,7 @@ BEGIN line := text.curLine; i := text.cursor.X - 1; - WHILE (i >= 0) & U.isLetter(getChar(line, i)) DO + WHILE (i >= 0) & U.isLetter(Lines.getChar(line, i)) DO DEC(i) END; @@ -1915,8 +1900,8 @@ BEGIN INC(i) END; IF (i # n) OR - ((x1 > 0) & isWordChar(getChar(curLine, x1 - 1))) OR - ((x2 < curLine.length) & isWordChar(getChar(curLine, x2))) THEN + ((x1 > 0) & isWordChar(Lines.getChar(curLine, x1 - 1))) OR + ((x2 < curLine.length) & isWordChar(Lines.getChar(curLine, x2))) THEN str := "" END END; @@ -1928,17 +1913,17 @@ PROCEDURE getWordPos (line: tLine; pos: INTEGER): INTEGER; VAR c: WCHAR; BEGIN - c := getChar(line, pos); + c := Lines.getChar(line, pos); IF isWordChar(c) THEN - WHILE (pos < line.length) & isWordChar(getChar(line, pos)) DO + WHILE (pos < line.length) & isWordChar(Lines.getChar(line, pos)) DO INC(pos) END ELSIF Lines.isSpace(c) THEN - WHILE (pos < line.length) & Lines.isSpace(getChar(line, pos)) DO + WHILE (pos < line.length) & Lines.isSpace(Lines.getChar(line, pos)) DO INC(pos) END ELSE - WHILE (pos < line.length) & ~Lines.isSpace(getChar(line, pos)) & ~isWordChar(getChar(line, pos)) DO + WHILE (pos < line.length) & ~Lines.isSpace(Lines.getChar(line, pos)) & ~isWordChar(Lines.getChar(line, pos)) DO INC(pos) END END @@ -1986,11 +1971,10 @@ BEGIN SetPos(text, 0, 0) ELSE n := leadingSpaces(text.curLine); - IF text.cursor.X > n THEN - SetPos(text, n, text.cursor.Y) - ELSE - SetPos(text, 0, text.cursor.Y) - END + IF text.cursor.X <= n THEN + n := 0 + END; + SetPos(text, n, text.cursor.Y) END |37: IF (text.cursor.X = 0) & (text.curLine.prev # NIL) THEN @@ -2036,17 +2020,13 @@ BEGIN delete(text); ShowCursor END - |ORD("C"): - IF ctrl THEN - IF selected(text) THEN - copy(text) - END - END - |ORD("X"): + |ORD("C"), ORD("X"): IF ctrl THEN IF selected(text) THEN copy(text); - delSelect(text) + IF code = ORD("X") THEN + delSelect(text) + END END END |ORD("V"): @@ -2100,18 +2080,18 @@ BEGIN cursorX := text.cursor.X; line := text.curLine; x1 := cursorX - 1; - IF (cursorX < line.length) & isWordChar(getChar(line, cursorX)) THEN + IF (cursorX < line.length) & isWordChar(Lines.getChar(line, cursorX)) THEN x2 := cursorX; - WHILE (x2 < line.length) & isWordChar(getChar(line, x2)) DO + WHILE (x2 < line.length) & isWordChar(Lines.getChar(line, x2)) DO INC(x2) END ELSE - WHILE (x1 >= 0) & ~isWordChar(getChar(line, x1)) DO + WHILE (x1 >= 0) & ~isWordChar(Lines.getChar(line, x1)) DO DEC(x1) END; x2 := x1 + 1 END; - WHILE (x1 >= 0) & isWordChar(getChar(line, x1)) DO + WHILE (x1 >= 0) & isWordChar(Lines.getChar(line, x1)) DO DEC(x1) END; INC(x1); @@ -2408,11 +2388,11 @@ BEGIN END setColors; -PROCEDURE setCanvas* (Canvas: G.tCanvas); +PROCEDURE setCanvas* (_canvas: G.tCanvas); BEGIN - canvas := Canvas; - charWidth := canvas.font.width; - charHeight := canvas.font.height + inter + canvas := _canvas; + charWidth := _canvas.font.width; + charHeight := _canvas.font.height + inter END setCanvas; @@ -2608,9 +2588,9 @@ BEGIN List._append(text, Lines.create(FALSE)); text.curLine := text.first(tLine); ChangeLog.changeInt(text.enc, E.CP866); - ChangeLog.changeInt(text.eol, RW.EOL_CRLF); + ChangeLog.changeInt(text.eol, E.EOL_CRLF); text.enc := E.CP866; - text.eol := RW.EOL_CRLF; + text.eol := E.EOL_CRLF; SetPos(text, 0, 0); resetSelect(text) RETURN text diff --git a/programs/develop/cedit/SRC/Utils.ob07 b/programs/develop/cedit/SRC/Utils.ob07 index bdc641c1de..0aad7a765c 100644 --- a/programs/develop/cedit/SRC/Utils.ob07 +++ b/programs/develop/cedit/SRC/Utils.ob07 @@ -32,34 +32,32 @@ CONST PROCEDURE streq* (s1, s2: INTEGER; n: INTEGER): BOOLEAN; VAR c1, c2: WCHAR; + res: BOOLEAN; BEGIN - WHILE n > 0 DO + res := TRUE; + WHILE (n > 0) & res DO SYSTEM.GET(s1, c1); SYSTEM.GET(s2, c2); - INC(s1, 2); - INC(s2, 2); - IF c1 = c2 THEN - DEC(n) - ELSE - n := 0 - END + res := c1 = c2; + INC(s1, SYSTEM.SIZE(WCHAR)); + INC(s2, SYSTEM.SIZE(WCHAR)); + DEC(n) END - RETURN c1 = c2 + RETURN res END streq; PROCEDURE append* (VAR s1: ARRAY OF WCHAR; s2: ARRAY OF WCHAR); VAR - n1, n2, i, j: INTEGER; + n, i, j: INTEGER; BEGIN - n1 := LENGTH(s1); - n2 := LENGTH(s2); + j := LENGTH(s1); + n := LENGTH(s2); - ASSERT(n1 + n2 < LEN(s1)); + ASSERT(j + n < LEN(s1)); i := 0; - j := n1; - WHILE i < n2 DO + WHILE i < n DO s1[j] := s2[i]; INC(i); INC(j) @@ -71,16 +69,15 @@ END append; PROCEDURE append8* (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR); VAR - n1, n2, i, j: INTEGER; + n, i, j: INTEGER; BEGIN - n1 := LENGTH(s1); - n2 := LENGTH(s2); + j := LENGTH(s1); + n := LENGTH(s2); - ASSERT(n1 + n2 < LEN(s1)); + ASSERT(j + n < LEN(s1)); i := 0; - j := n1; - WHILE i < n2 DO + WHILE i < n DO s1[j] := s2[i]; INC(i); INC(j) diff --git a/programs/develop/cedit/SRC/libimg.ob07 b/programs/develop/cedit/SRC/libimg.ob07 deleted file mode 100644 index a68b3d2cd8..0000000000 --- a/programs/develop/cedit/SRC/libimg.ob07 +++ /dev/null @@ -1,97 +0,0 @@ -(* - Copyright 2016, 2021, 2022 Anton Krotov - - This file is part of CEdit. - - CEdit is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - CEdit is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with CEdit. If not, see . -*) - -MODULE LibImg; - -IMPORT SYSTEM, KOSAPI, File; - - -VAR - - file: INTEGER; - - -PROCEDURE [stdcall, "libimg.obj", ""] img_decode (data, size, options: INTEGER): INTEGER; END; -PROCEDURE [stdcall, "libimg.obj", ""] img_to_rgb2 (data, data_rgb: INTEGER); END; -PROCEDURE [stdcall, "libimg.obj", ""] img_scale (src, crop_x, crop_y, crop_width, crop_height, dst, scale, inter, param1, param2: INTEGER): INTEGER; END; -PROCEDURE [stdcall, "libimg.obj", ""] img_destroy* (img: INTEGER); END; - -PROCEDURE GetInf*(img: INTEGER; VAR sizeX, sizeY, data: INTEGER); -BEGIN - SYSTEM.GET(img + 4, sizeX); - SYSTEM.GET(img + 8, sizeY); - SYSTEM.GET(img + 24, data); -END GetInf; - - -PROCEDURE GetImg*(ptr, n, Width: INTEGER; VAR sizeY: INTEGER): INTEGER; -VAR image_data, dst, x, y, type, rgb, data: INTEGER; -BEGIN - image_data := img_decode(ptr, n, 0); - IF image_data # 0 THEN - SYSTEM.GET(image_data + 4, x); - SYSTEM.GET(image_data + 8, y); - SYSTEM.GET(image_data + 20, type); - IF type # 2 THEN - rgb := KOSAPI.malloc(x * y * 3); - IF rgb # 0 THEN - img_to_rgb2(image_data, rgb); - SYSTEM.GET(image_data + 24, data); - data := KOSAPI.free(data); - SYSTEM.PUT(image_data + 24, rgb); - SYSTEM.PUT(image_data + 20, 2) - ELSE - img_destroy(image_data); - image_data := 0 - END - END; - IF (x > Width) & (image_data # 0) THEN - dst := img_scale(image_data, 0, 0, x, y, dst, 3, 1, Width, (y * Width) DIV x); - img_destroy(image_data); - image_data := dst - END; - IF image_data # 0 THEN - SYSTEM.GET(image_data + 8, sizeY) - END - END - RETURN image_data -END GetImg; - - -PROCEDURE LoadFromFile* (FName: ARRAY OF CHAR; Width: INTEGER; VAR sizeY: INTEGER): INTEGER; -VAR F: File.FS; n, size, res: INTEGER; -BEGIN - res := 0; - F := File.Open(FName); - IF F # NIL THEN - size := File.Seek(F, 0, File.SEEK_END); - n := File.Seek(F, 0, File.SEEK_BEG); - file := KOSAPI.malloc(size + 1024); - IF file # 0 THEN - n := File.Read(F, file, size); - res := GetImg(file, n, Width, sizeY); - n := KOSAPI.free(file) - END; - File.Close(F) - END - RETURN res -END LoadFromFile; - - -END LibImg. diff --git a/programs/develop/cedit/SRC/scroll.ob07 b/programs/develop/cedit/SRC/scroll.ob07 index 9146eb9bdc..6a12c97205 100644 --- a/programs/develop/cedit/SRC/scroll.ob07 +++ b/programs/develop/cedit/SRC/scroll.ob07 @@ -185,31 +185,32 @@ END resize; PROCEDURE setValue* (VAR scroll: tScroll; value: INTEGER); VAR - pos, maxPos, n, m: INTEGER; + pos, maxPos, maxVal, n, m: INTEGER; BEGIN + maxVal := scroll.maxVal; IF scroll.vertical THEN maxPos := scroll.height ELSE maxPos := scroll.width END; maxPos := maxPos - scroll.btnSize*2 - scroll.sliderSize + 1; - IF (value < 0) OR (scroll.maxVal <= 0) THEN + IF (value < 0) OR (maxVal <= 0) THEN value := 0; pos := 0 - ELSIF value > scroll.maxVal THEN - value := scroll.maxVal; + ELSIF value > maxVal THEN + value := maxVal; pos := maxPos ELSE - IF (maxPos + 1) >= scroll.maxVal THEN - n := (maxPos + 1) DIV scroll.maxVal; - m := (maxPos + 1) MOD scroll.maxVal; + IF (maxPos + 1) >= maxVal THEN + n := (maxPos + 1) DIV maxVal; + m := (maxPos + 1) MOD maxVal; pos := value*n + MIN(value, m) ELSE - pos := FLOOR(FLT(value)*FLT(maxPos + 1)/FLT(scroll.maxVal)) + pos := FLOOR(FLT(value)*FLT(maxPos + 1)/FLT(maxVal)) END; IF pos > maxPos THEN pos := maxPos; - value := scroll.maxVal + value := maxVal END END; scroll.pos := pos; @@ -224,9 +225,10 @@ END ceil; PROCEDURE setPos (VAR scroll: tScroll; pos: INTEGER); VAR - maxPos, value, n, m, x, x0, q: INTEGER; + maxPos, value, maxVal, n, m, x, x0, q: INTEGER; BEGIN - IF scroll.maxVal > 0 THEN + maxVal := scroll.maxVal; + IF maxVal > 0 THEN IF scroll.vertical THEN maxPos := scroll.height ELSE @@ -238,11 +240,11 @@ BEGIN value := 0 ELSIF pos >= maxPos THEN pos := maxPos; - value := scroll.maxVal + value := maxVal ELSE - IF scroll.maxVal <= maxPos + 1 THEN - n := (maxPos + 1) DIV scroll.maxVal; - m := (maxPos + 1) MOD scroll.maxVal; + IF maxVal <= maxPos + 1 THEN + n := (maxPos + 1) DIV maxVal; + m := (maxPos + 1) MOD maxVal; q := m*(n + 1); IF q < pos THEN @@ -263,16 +265,16 @@ BEGIN pos := x; IF pos > maxPos THEN pos := maxPos; - value := scroll.maxVal + value := maxVal END END ELSE - value := FLOOR(FLT(scroll.maxVal)*FLT(pos)/FLT(maxPos + 1)) + value := FLOOR(FLT(maxVal)*FLT(pos)/FLT(maxPos + 1)) END END ELSE pos := 0; - scroll.value := 0 + value := 0 END; scroll.pos := pos; scroll.value := value