1
0
mirror of synced 2026-04-27 12:39:46 +00:00

Rmk85 Tedit distinguish public TEDIT.NTHCHARCODE from private \TEDIT.NTH..., fix screen update bug (#2091)

* Distinguish public TEDIT.NTHCHARCODE... from private \TEDIT.NTHCHARCODE...

* Fix screen-update bug: deleting the character before the first character in a window

* glitch in region code
This commit is contained in:
rmkaplan
2025-04-09 11:46:01 -07:00
committed by GitHub
parent 78e88e238b
commit cd3889874f
23 changed files with 757 additions and 702 deletions

View File

@@ -1,12 +1,13 @@
(DEFINE-FILE-INFO PACKAGE "INTERLISP" READTABLE "INTERLISP" BASE 10)
(FILECREATED "26-Mar-2025 00:29:46" {WMEDLEY}<library>TEDIT>TEDIT-STREAM.;865 175471
(FILECREATED "28-Mar-2025 18:32:27" {WMEDLEY}<library>TEDIT>TEDIT-STREAM.;872 187180
:EDIT-BY rmk
:CHANGES-TO (FNS \TEDIT.INSERTCH)
:CHANGES-TO (FNS \TEDIT.NTHCHARCODE \TEDIT.TEXTBOUT \TEDIT.RPLCHARCODE)
(VARS TEDIT-STREAMCOMS)
:PREVIOUS-DATE "22-Mar-2025 21:37:13" {WMEDLEY}<library>TEDIT>TEDIT-STREAM.;863)
:PREVIOUS-DATE "26-Mar-2025 00:29:46" {WMEDLEY}<library>TEDIT>TEDIT-STREAM.;865)
(PRETTYCOMPRINT TEDIT-STREAMCOMS)
@@ -57,6 +58,10 @@
\TEDIT.TEXTSETEOF \TEDIT.TEXTSETFILEPTR \TEDIT.TEXTDSPXPOSITION \TEDIT.TEXTDSPYPOSITION
\TEDIT.TEXTLEFTMARGIN \TEDIT.TEXTRIGHTMARGIN \TEDIT.TEXTDSPCHARWIDTH
\TEDIT.TEXTDSPSTRINGWIDTH \TEDIT.TEXTDSPLINEFEED)
(* ;; "Access by character")
(FNS \TEDIT.NTHCHARCODE \TEDIT.PIECE.NTHCHARCODE \TEDIT.RPLCHARCODE)
(COMS
(* ;; "Editing support")
@@ -1019,7 +1024,8 @@
(\TEDIT.THELP "UNKNOWN PIECE TYPE")))])
(\TEDIT.TEXTBOUT
[LAMBDA (TSTREAM CHAR) (* ; "Edited 17-Nov-2024 10:05 by rmk")
[LAMBDA (TSTREAM CHAR) (* ; "Edited 28-Mar-2025 10:13 by rmk")
(* ; "Edited 17-Nov-2024 10:05 by rmk")
(* ; "Edited 6-Sep-2024 13:06 by rmk")
(* ; "Edited 27-Aug-2024 14:50 by rmk")
(* ; "Edited 13-Aug-2024 08:28 by rmk")
@@ -1060,7 +1066,7 @@
(ERROR "FILE NOT OPEN" TSTREAM)
(RETURN))
(if (ILEQ CHNO (FGETTOBJ TEXTOBJ TEXTLEN))
then (TEDIT.RPLCHARCODE TSTREAM CHNO CHAR) (* ;
then (\TEDIT.RPLCHARCODE TSTREAM CHNO CHAR) (* ;
 "Replace in the middle, add at the end")
elseif (AND (\TEDIT.INSERTCH CHAR CHNO TEXTOBJ (MEMB CHAR (FGETTOBJ TEXTOBJ
PARABREAKCHARS)))
@@ -2193,6 +2199,190 @@
(* ;; "Access by character")
(DEFINEQ
(\TEDIT.NTHCHARCODE
[LAMBDA (TSTREAM N) (* ; "Edited 28-Mar-2025 18:31 by rmk")
(* ; "Edited 7-Jul-2024 11:09 by rmk")
(* ; "Edited 29-Apr-2024 13:06 by rmk")
(* ; "Edited 17-Mar-2024 00:27 by rmk")
(* ; "Edited 1-Feb-2024 09:50 by rmk")
(* ; "Edited 8-Nov-2023 08:41 by rmk")
(* ; "Edited 4-Nov-2023 15:23 by rmk")
(* ;; "Returns the Nth character of TEXTOBJ. First character is N=1, NIL if out of bounds. If TSTREAM is a selection, treats it as a substring, N is relative to that.")
(LET ((TEXTOBJ (GETTSTR TSTREAM TEXTOBJ))
START-OF-PIECE)
(DECLARE (SPECVARS START-OF-PIECE))
(CL:WHEN (AND (IGEQ N 1)
(ILEQ N (FGETTOBJ TEXTOBJ TEXTLEN)))
(\TEDIT.PIECE.NTHCHARCODE TEXTOBJ (\TEDIT.CHTOPC N TEXTOBJ T)
(IDIFFERENCE (ADD1 N)
START-OF-PIECE)))])
(\TEDIT.PIECE.NTHCHARCODE
[LAMBDA (TEXTOBJ PC OFFSET) (* ; "Edited 21-Oct-2024 00:26 by rmk")
(* ; "Edited 29-Apr-2024 08:46 by rmk")
(* ; "Edited 22-Mar-2024 00:02 by rmk")
(* ; "Edited 1-Feb-2024 09:55 by rmk")
(* ; "Edited 6-Jan-2024 16:36 by rmk")
(* ; "Edited 29-Dec-2023 11:55 by rmk")
(* ; "Edited 8-Dec-2023 22:54 by rmk")
(* ; "Edited 7-Dec-2023 15:57 by rmk")
(* ; "Edited 8-Nov-2023 08:43 by rmk")
(* ; "Edited 5-Nov-2023 08:17 by rmk")
(* ;; "Returns the OFFSETth charcode of PC, NIL if OFFSET is out of bounds. For file pieces, ensures that the backing stream is restored to its original position, so that it remains comaptible with the values (buffer, offset) in the textstream.")
(CL:WHEN (AND (IGEQ OFFSET 1)
(ILEQ OFFSET (PLEN PC)))
[LET ((PCONTENTS (PCONTENTS PC))
FILEPOS)
(SELECTC (PTYPE PC)
(STRING.PTYPES (NTHCHARCODE PCONTENTS OFFSET))
(THINFILE.PTYPE
(SETQ FILEPOS (\GETFILEPTR PCONTENTS))
(\SETFILEPTR PCONTENTS (IPLUS (PFPOS PC)
(SUB1 OFFSET)))
(PROG1 (BIN PCONTENTS)
(\SETFILEPTR PCONTENTS FILEPOS)))
(FATFILE1.PTYPE
(SETQ FILEPOS (\GETFILEPTR PCONTENTS))
(\SETFILEPTR PCONTENTS (IPLUS (PFPOS PC)
(SUB1 OFFSET)))
(PROG1 (create WORD
HIBYTE _ (PCHARSET PC)
LOBYTE _ (BIN PCONTENTS))
(\SETFILEPTR PCONTENTS FILEPOS)))
(FATFILE2.PTYPE
(SETQ FILEPOS (\GETFILEPTR PCONTENTS))
(\SETFILEPTR PCONTENTS (IPLUS (PFPOS PC)
(UNFOLD (SUB1 OFFSET)
2)))
(PROG1 (\WIN PCONTENTS)
(\SETFILEPTR PCONTENTS FILEPOS)))
(UTF8.PTYPE (SETQ FILEPOS (\GETFILEPTR PCONTENTS))
[\SETFILEPTR PCONTENTS (IPLUS (PFPOS PC)
(ITIMES (SUB1 OFFSET)
(PBYTESPERCHAR PC]
(PROG1 (UTF8.INCCODEFN PCONTENTS)
(\SETFILEPTR PCONTENTS FILEPOS)))
(OBJECT.PTYPE PCONTENTS)
(SUBSTREAM.PTYPE (* ; "A substream stored as an object")
(\TEDIT.THELP 'SUBSTREAM?)
(BIN (IMAGEOBJPROP PCONTENTS 'SUBSTREAM)))
(PROGN
(* ;; "For pieces not listed because they require more work. Assumes the function updates COFFSET and that multi-byte characters are safe: don't cross buffer boundaries.")
(\TEDIT.THELP '\TEDIT.PIECE.NTHCHARCODE])])
(\TEDIT.RPLCHARCODE
[LAMBDA (TSTREAM N NEWCHARCODE NEWCHARLOOKS DONTDISPLAY) (* ; "Edited 28-Mar-2025 10:04 by rmk")
(* ;; "Replaces the Nth charcode (or object) in TSTREAM with NEWCHARCODE (or object) with NEWCHARLOOKS. This is accomplished by isolating the target character into a length 1 piece, then converting that into a string (or object) piece containing NEWCHAR.")
(* ;; "If DONTDISPLAY, this doesn't update the display. ")
(* ;; "NOTE: this may introduce new pieces, so must be used carefully with other piece-based or BIN-based iterations.")
(SETQ TSTREAM (TEXTSTREAM TSTREAM))
(CL:UNLESS (\TEDIT.READONLY TSTREAM)
(PROG ((TEXTOBJ (TEXTOBJ! (GETTSTR TSTREAM TEXTOBJ)))
PC OFFSET START-OF-PIECE OLDCHAR PARALAST)
(DECLARE (SPECVARS START-OF-PIECE))
(replace (STREAM BINABLE) of TSTREAM with NIL)
(SETQ PC (\TEDIT.CHTOPC N TEXTOBJ T))
(SETQ OFFSET (ADD1 (IDIFFERENCE N START-OF-PIECE)))
(* ; "Change is at OFFSET 1")
(SETQ PARALAST (MEMB NEWCHARCODE (FGETTOBJ TEXTOBJ PARABREAKCHARS)))
[if (AND (SMALLP NEWCHARCODE)
(MEMB (PTYPE PC)
STRING.PTYPES)
(OR (NULL NEWCHARLOOKS)
(EQ NEWCHARLOOKS (PLOOKS PC)))
(NEQ PC (FGETTOBJ TEXTOBJ SUFFIXPIECE))
(NOT PARALAST))
then
(* ;;
 "Fast case: Smash a new character code into an existing string piece with same looks. ")
(SETQ OLDCHAR (NTHCHARCODE (PCONTENTS PC)
OFFSET))
(RPLCHARCODE (PCONTENTS PC)
OFFSET NEWCHARCODE) (* ;
 "May upgrade string from thin to fat")
(CL:WHEN (AND (EQ THINSTRING.PTYPE (PTYPE PC))
(IGREATERP NEWCHARCODE 255))
(FSETPC PC PTYPE FATSTRING.PTYPE)
(FSETPC PC PBINABLE NIL)
(FSETPC PC PBYTESPERCHAR 2)
(FSETPC PC PBYTELEN (UNFOLD (PLEN PC)
2)))
elseif [AND (IMAGEOBJP NEWCHARCODE)
(EQ OBJECT.PTYPE (PTYPE PC))
(OR (NULL NEWCHARLOOKS)
(EQ NEWCHARLOOKS (PLOOKS PC]
then (SETQ OLDCHAR (POBJ PC)) (* ; "We know PLEN is 1")
(FSETPC PC PCONTENTS NEWCHARCODE)
else
(* ;;
 "The PC that contained character N becomes the suffix of characters after N, ")
(CL:UNLESS (IEQP OFFSET (PLEN PC)) (* ; "No suffix for the last character")
(* ;;
 "Chop off the suffix (essentially (\TEDIT.ALIGNEDPIECE CHNO ..) but we already have the piece")
(\TEDIT.SPLITPIECE PC OFFSET TEXTOBJ)
(SETQ PC (PREVPIECE PC))) (* ;
 "Original PC holds the suffix, new PC ends with change position.")
(CL:UNLESS (EQ OFFSET 1)
(SETQ PC (\TEDIT.SPLITPIECE PC (SUB1 OFFSET)
TEXTOBJ))) (* ;
 "Chop off the prefix. PC is now the singleton target ")
(* ;; "N is now isolated into a one-character new piece which we smash. ")
(SETQ OLDCHAR (\TEDIT.PIECE.NTHCHARCODE TEXTOBJ PC 1))
(if (IMAGEOBJP NEWCHARCODE)
then (FSETPC PC PBINABLE NIL)
(FSETPC PC PCONTENTS NEWCHARCODE)
(FSETPC PC PTYPE OBJECT.PTYPE)
(FSETPC PC PBYTESPERCHAR NIL) (* ; "Doesn't make sense for objects")
(FSETPC PC PBYTELEN NIL)
else (FSETPC PC PCONTENTS (MKSTRING (CHARACTER NEWCHARCODE)))
(* ;
 "Use the extend-string in INSERTCH for repeated calls?")
(if (IGREATERP NEWCHARCODE 255)
then (FSETPC PC PTYPE FATSTRING.PTYPE)
(FSETPC PC PBINABLE NIL)
(FSETPC PC PBYTESPERCHAR 2)
(FSETPC PC PBYTELEN 2)
else (FSETPC PC PTYPE THINSTRING.PTYPE)
(FSETPC PC PBINABLE T)
(FSETPC PC PBYTESPERCHAR 1)
(FSETPC PC PBYTELEN 1)
(FSETPC PC PCHARSET 0)))
(FSETPC PC PFPOS NIL)
(CL:WHEN NEWCHARLOOKS
(FSETPC PC PLOOKS (CL:IF (FONTP NEWCHARLOOKS)
(\TEDIT.UNIQUIFY.CHARLOOKS (\TEDIT.CHARLOOKS.FROM.FONT
NEWCHARLOOKS)
TEXTOBJ)
NEWCHARLOOKS)))]
(CL:WHEN PARALAST (FSETPC PC PPARALAST T))
(\TEDIT.HISTORYADD TEXTOBJ (\TEDIT.HISTORY.EVENT TEXTOBJ :ReplaceCode N NIL NIL NIL
OLDCHAR))
(CL:UNLESS (OR DONTDISPLAY (NOT (\TEDIT.PRIMARYPANE TEXTOBJ)))
(\TEDIT.UPDATE.LINES TEXTOBJ 'CHANGED N 1))
(RETURN TSTREAM)))])
)
(* ;; "Editing support")
(DECLARE%: EVAL@COMPILE DONTCOPY
@@ -2879,31 +3069,32 @@
(ADDTOVAR LAMA TEXTPROP)
)
(DECLARE%: DONTCOPY
(FILEMAP (NIL (37107 67708 (\TEDIT.TEXTBIN 37117 . 47867) (\TEDIT.TEXTPEEKBIN 47869 . 53419) (
\TEDIT.TEXTBACKFILEPTR 53421 . 59094) (\TEDIT.TEXTBOUT 59096 . 63498) (\TEDIT.INSTALL.FILEBUFFER 63500
. 67706)) (68606 72654 (\TEDIT.TEXTOUTCHARFN 68616 . 70172) (\TEDIT.TEXTINCCODEFN 70174 . 70913) (
\TEDIT.TEXTBACKCCODEFN 70915 . 71507) (\TEDIT.TEXTFORMATBYTESTREAM 71509 . 72212) (
\TEDIT.TEXTFORMATBYTESTRING 72214 . 72652)) (72701 84222 (OPENTEXTSTREAM 72711 . 79663) (
COPYTEXTSTREAM 79665 . 83445) (TEDIT.STREAMCHANGEDP 83447 . 83749) (TXTFILE 83751 . 84220)) (84223
114083 (\TEDIT.REOPENTEXTSTREAM 84233 . 85585) (\TEDIT.OPENTEXTSTREAM.PIECES 85587 . 90017) (
\TEDIT.OPENTEXTSTREAM.PROPS 90019 . 91121) (\TEDIT.OPENTEXTSTREAM.SETUP.SEL 91123 . 96209) (
\TEDIT.OPENTEXTSTREAM.WINDOW 96211 . 98892) (\TEDIT.OPENTEXTSTREAM.DEFAULTLOOKS 98894 . 101864) (
\TEDIT.OPENTEXTFILE 101866 . 103579) (\TEDIT.CREATE.TEXTSTREAM 103581 . 104626) (\TEDIT.REOPEN.STREAM
104628 . 106964) (\TEDIT.TEXTINIT 106966 . 114081)) (114121 115309 (\TEDIT.TTYBOUT 114131 . 115307)) (
115427 134219 (\TEDIT.TEXTCLOSEF 115437 . 116761) (\TEDIT.TEXTDSPFONT 116763 . 117733) (
\TEDIT.TEXTEOFP 117735 . 119490) (\TEDIT.TEXTGETEOFPTR 119492 . 119815) (\TEDIT.TEXTSETEOFPTR 119817
. 120907) (\TEDIT.TEXTGETFILEPTR 120909 . 123744) (\TEDIT.TEXTSETFILEINFO 123746 . 124254) (
\TEDIT.TEXTOPENF 124256 . 125187) (\TEDIT.TEXTSETEOF 125189 . 125805) (\TEDIT.TEXTSETFILEPTR 125807 .
127848) (\TEDIT.TEXTDSPXPOSITION 127850 . 128867) (\TEDIT.TEXTDSPYPOSITION 128869 . 129610) (
\TEDIT.TEXTLEFTMARGIN 129612 . 130203) (\TEDIT.TEXTRIGHTMARGIN 130205 . 133368) (
\TEDIT.TEXTDSPCHARWIDTH 133370 . 133674) (\TEDIT.TEXTDSPSTRINGWIDTH 133676 . 133982) (
\TEDIT.TEXTDSPLINEFEED 133984 . 134217)) (135266 156139 (\TEDIT.DELETE.SELPIECES 135276 . 138789) (
\TEDIT.INSERTCH 138791 . 146721) (\TEDIT.INSERTCH.HISTORY 146723 . 150187) (\TEDIT.INSERTEOL 150189 .
152014) (\TEDIT.INSERTCH.INSERTION 152016 . 154853) (\TEDIT.INSERTCH.EXTEND 154855 . 156137)) (156140
157644 (\TEDIT.NEXTCHANGEABLE.CHNO 156150 . 156865) (\TEDIT.LASTCHANGEABLE.CHNO 156867 . 157642)) (
157645 159349 (\SETUPGETCH 157655 . 159347)) (159407 163865 (\TEDIT.INSTALL.PIECE 159417 . 163863)) (
163903 172652 (TEXTPROP 163913 . 164260) (GETTEXTPROP 164262 . 164506) (PUTTEXTPROP 164508 . 164765) (
GETTEXTPROPS 164767 . 165211) (PUTTEXTPROPS 165213 . 166117) (\TEDIT.TEXTPROP 166119 . 172650)) (
172653 174723 (\TEDIT.TEXTOBJ.PROPNAMES 172663 . 173615) (\TEDIT.TEXTOBJ.PROPFETCHFN 173617 . 174133)
(\TEDIT.TEXTOBJ.PROPSTOREFN 174135 . 174721)))))
(FILEMAP (NIL (37315 68029 (\TEDIT.TEXTBIN 37325 . 48075) (\TEDIT.TEXTPEEKBIN 48077 . 53627) (
\TEDIT.TEXTBACKFILEPTR 53629 . 59302) (\TEDIT.TEXTBOUT 59304 . 63819) (\TEDIT.INSTALL.FILEBUFFER 63821
. 68027)) (68927 72975 (\TEDIT.TEXTOUTCHARFN 68937 . 70493) (\TEDIT.TEXTINCCODEFN 70495 . 71234) (
\TEDIT.TEXTBACKCCODEFN 71236 . 71828) (\TEDIT.TEXTFORMATBYTESTREAM 71830 . 72533) (
\TEDIT.TEXTFORMATBYTESTRING 72535 . 72973)) (73022 84543 (OPENTEXTSTREAM 73032 . 79984) (
COPYTEXTSTREAM 79986 . 83766) (TEDIT.STREAMCHANGEDP 83768 . 84070) (TXTFILE 84072 . 84541)) (84544
114404 (\TEDIT.REOPENTEXTSTREAM 84554 . 85906) (\TEDIT.OPENTEXTSTREAM.PIECES 85908 . 90338) (
\TEDIT.OPENTEXTSTREAM.PROPS 90340 . 91442) (\TEDIT.OPENTEXTSTREAM.SETUP.SEL 91444 . 96530) (
\TEDIT.OPENTEXTSTREAM.WINDOW 96532 . 99213) (\TEDIT.OPENTEXTSTREAM.DEFAULTLOOKS 99215 . 102185) (
\TEDIT.OPENTEXTFILE 102187 . 103900) (\TEDIT.CREATE.TEXTSTREAM 103902 . 104947) (\TEDIT.REOPEN.STREAM
104949 . 107285) (\TEDIT.TEXTINIT 107287 . 114402)) (114442 115630 (\TEDIT.TTYBOUT 114452 . 115628)) (
115748 134540 (\TEDIT.TEXTCLOSEF 115758 . 117082) (\TEDIT.TEXTDSPFONT 117084 . 118054) (
\TEDIT.TEXTEOFP 118056 . 119811) (\TEDIT.TEXTGETEOFPTR 119813 . 120136) (\TEDIT.TEXTSETEOFPTR 120138
. 121228) (\TEDIT.TEXTGETFILEPTR 121230 . 124065) (\TEDIT.TEXTSETFILEINFO 124067 . 124575) (
\TEDIT.TEXTOPENF 124577 . 125508) (\TEDIT.TEXTSETEOF 125510 . 126126) (\TEDIT.TEXTSETFILEPTR 126128 .
128169) (\TEDIT.TEXTDSPXPOSITION 128171 . 129188) (\TEDIT.TEXTDSPYPOSITION 129190 . 129931) (
\TEDIT.TEXTLEFTMARGIN 129933 . 130524) (\TEDIT.TEXTRIGHTMARGIN 130526 . 133689) (
\TEDIT.TEXTDSPCHARWIDTH 133691 . 133995) (\TEDIT.TEXTDSPSTRINGWIDTH 133997 . 134303) (
\TEDIT.TEXTDSPLINEFEED 134305 . 134538)) (134578 145928 (\TEDIT.NTHCHARCODE 134588 . 135938) (
\TEDIT.PIECE.NTHCHARCODE 135940 . 139741) (\TEDIT.RPLCHARCODE 139743 . 145926)) (146975 167848 (
\TEDIT.DELETE.SELPIECES 146985 . 150498) (\TEDIT.INSERTCH 150500 . 158430) (\TEDIT.INSERTCH.HISTORY
158432 . 161896) (\TEDIT.INSERTEOL 161898 . 163723) (\TEDIT.INSERTCH.INSERTION 163725 . 166562) (
\TEDIT.INSERTCH.EXTEND 166564 . 167846)) (167849 169353 (\TEDIT.NEXTCHANGEABLE.CHNO 167859 . 168574) (
\TEDIT.LASTCHANGEABLE.CHNO 168576 . 169351)) (169354 171058 (\SETUPGETCH 169364 . 171056)) (171116
175574 (\TEDIT.INSTALL.PIECE 171126 . 175572)) (175612 184361 (TEXTPROP 175622 . 175969) (GETTEXTPROP
175971 . 176215) (PUTTEXTPROP 176217 . 176474) (GETTEXTPROPS 176476 . 176920) (PUTTEXTPROPS 176922 .
177826) (\TEDIT.TEXTPROP 177828 . 184359)) (184362 186432 (\TEDIT.TEXTOBJ.PROPNAMES 184372 . 185324) (
\TEDIT.TEXTOBJ.PROPFETCHFN 185326 . 185842) (\TEDIT.TEXTOBJ.PROPSTOREFN 185844 . 186430)))))
STOP