PageRenderTime 27ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/support/generic/lineedit.fth

https://bitbucket.org/garryl/camelforth
Forth | 169 lines | 126 code | 43 blank | 0 comment | 2 complexity | f4b1e7c29e3cd296c644be5559b7199a MD5 | raw file
Possible License(s): GPL-3.0
  1. \ ****************************************************************************
  2. \ CamelForth for the Zilog Z80
  3. \ Copyright (c) 1994,1995 Bradford J. Rodriguez
  4. \ With contributions by Douglas Beattie Jr., 1998
  5. \ Widely extended and reorganised by Garry Lancaster, 1999-2011
  6. \ Z88, Sprinter, ZX Spectrum +3/+3e ports by Garry Lancaster, 1999-2011
  7. \
  8. \ This program is free software; you can redistribute it and/or modify
  9. \ it under the terms of the GNU General Public License as published by
  10. \ the Free Software Foundation; either version 3 of the License, or
  11. \ (at your option) any later version.
  12. \
  13. \ This program is distributed in the hope that it will be useful,
  14. \ but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. \ GNU General Public License for more details.
  17. \
  18. \ You should have received a copy of the GNU General Public License
  19. \ along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. \ ****************************************************************************
  21. CR .( Loading Line Editor...)
  22. \ Fig-Forth style block editor with extra facilities
  23. VARIABLE SCR
  24. : LIST ( U -- )
  25. DUP SCR ! CR ." Block " DUP . BLOCK
  26. 16 FOR 16 R@ -
  27. CR . SPACE 64 2DUP TYPE +
  28. STEP DROP ;
  29. VOCABULARY EDITOR
  30. ALSO EDITOR DEFINITIONS ALSO FORTH
  31. 64 CONSTANT C/L
  32. VARIABLE CNT \ length of the string in PAD
  33. VARIABLE R# \ cursor offset to screen
  34. : TEXT ( CHARACTER -- )
  35. PAD C/L BLANK PARSE CNT ! PAD CNT @ CMOVE ;
  36. : LINE ( UNSIGNED -- CDATA -> CHARACTER )
  37. DUP 15 > ABORT" INVALID LINE NUMBER"
  38. SCR @ BLOCK SWAP C/L * + ;
  39. : -CMOVE ( CDATA -> CHARACTER UNSIGNED -- )
  40. LINE C/L CMOVE UPDATE ;
  41. : #LOCATE ( -- UNSIGNED UNSIGNED )
  42. R# @ C/L /MOD ;
  43. : #LEAD ( -- CDATA -> CHARACTER UNSIGNED )
  44. #LOCATE LINE SWAP ;
  45. : #LAG ( -- CDATA -> CHARACTER UNSIGNED )
  46. #LEAD SWAP OVER + C/L ROT - ;
  47. : DELETE ( UNSIGNED -- )
  48. #LEAD ROT MIN >R DROP
  49. #LAG + R@ -
  50. #LAG R@ NEGATE R# +! #LEAD + SWAP CMOVE
  51. R> BLANK UPDATE ;
  52. : H ( UNSIGNED -- )
  53. LINE PAD C/L CMOVE ;
  54. : E ( UNSIGNED -- )
  55. LINE C/L BLANK UPDATE ;
  56. : S ( UNSIGNED -- )
  57. DUP 14 MIN 14 DO I LINE I 1+ -CMOVE -1 +LOOP E ;
  58. : D ( UNSIGNED -- )
  59. DUP H 15 DUP ROT ?DO I 1+ LINE I -CMOVE LOOP E ;
  60. : R ( UNSIGNED -- )
  61. PAD SWAP -CMOVE ;
  62. : M ( INTEGER -- )
  63. CR R# +! #LOCATE 2 .R DROP SPACE
  64. #LEAD TYPE [CHAR] _ EMIT #LAG TYPE ;
  65. : T ( UNSIGNED -- )
  66. DUP C/L * R# ! H 0 M ;
  67. : L ( -- )
  68. SCR @ LIST 0 M ;
  69. : B ( -- )
  70. CNT @ NEGATE M ;
  71. : P ( UNSIGNED -- )
  72. 0 TEXT R ;
  73. : I ( UNSIGNED -- )
  74. DUP S R ;
  75. : C ( -- )
  76. 0 TEXT #LAG CNT @ MIN >R
  77. R@ R# +! DUP #LAG CMOVE>
  78. PAD SWAP R> CMOVE
  79. UPDATE 0 M ;
  80. : TOP ( -- )
  81. 0 R# ! ;
  82. : CLEAR ( UNSIGNED -- )
  83. DUP BLOCK 1024 BLANK UPDATE SCR ! TOP ;
  84. : WIPE
  85. SCR @ CLEAR L ;
  86. : INIT ( U1 U2 -- )
  87. TUCK SWAP - 1+ FOR DUP CLEAR 1- STEP DROP ;
  88. : COPY ( UNSIGNED 1ST -- )
  89. SWAP BLOCK SWAP BUFFER 1024 CMOVE UPDATE ;
  90. : LIST ( UNSIGNED -- )
  91. TOP LIST ;
  92. : 1LINE ( -- FLAG )
  93. #LAG PAD CNT @ SEARCH
  94. IF NIP #LAG NIP SWAP - CNT @ + R# +! TRUE
  95. ELSE 2DROP #LAG R# +! DROP FALSE
  96. THEN ;
  97. : FINDTEXT ( -- )
  98. BEGIN 1023 R# @ <
  99. IF TOP TRUE ABORT" NOT FOUND"
  100. THEN 1LINE
  101. UNTIL ;
  102. : N ( -- )
  103. FINDTEXT 0 M ;
  104. : F ( -- )
  105. 0 TEXT N ;
  106. : X ( -- )
  107. 0 TEXT FINDTEXT CNT @ DELETE 0 M ;
  108. : TILL ( -- )
  109. #LEAD + 0 TEXT 1LINE 0= ABORT" NOT FOUND"
  110. #LEAD + SWAP - ABS DELETE 0 M ;
  111. : V
  112. #LOCATE NIP 3 + 15 MIN 5 - 0 MAX DUP 6 + SWAP
  113. DO CR I 2 .R SPACE I LINE C/L TYPE LOOP
  114. 0 M ;
  115. : ED ( UNSIGNED -- )
  116. DUP H PAD C/L NEGATE ACCEPT DROP R ;
  117. : BINS ( B1 B2 U -- )
  118. >R BEGIN DUP DUP R@ + COPY 1- 2DUP U> UNTIL
  119. DROP DUP R> FOR DUP CLEAR 1+ STEP DROP SCR ! TOP ;
  120. : BDEL ( B1 B2 U -- )
  121. >R OVER R@ + BEGIN DUP DUP R@ - COPY 1+ 2DUP U< UNTIL
  122. DROP R> FOR DUP CLEAR 1- STEP DROP SCR ! TOP ;
  123. : INDEX ( U1 U2 -- )
  124. OVER - 1+
  125. FOR CR DUP 6 .R SPACE DUP BLOCK C/L TYPE 1+ STEP DROP ;
  126. FORTH DEFINITIONS PREVIOUS PREVIOUS