Forth
http://fforum.winglion.ru/

*удалить вертикальный блок из текста
http://fforum.winglion.ru/viewtopic.php?f=19&t=2560
Страница 1 из 1

Автор:  mOleg [ Сб апр 03, 2010 10:28 ]
Заголовок сообщения:  *удалить вертикальный блок из текста

дано: в памяти по указанному адресу находится текстовый блок, включающий в себя некоторое количество строк в ISO кодировке(т.е. размер символа фиксирован и равен одному байту). В явном виде заданы адрес начала блока и его длина. Каждая строка отделена от следующей символом(символами) перевода строки. Необходимо удалить из текста прямоугольный блок, заданный начальной строкой и начальной позицией в строке, начиная с которой будет вырезаться текстовый блок, а так же количество строк и количество символов, которые необходимо вырезать из текста. В случае, если заданный размер блока выходит за пределы текстового блока, удалять только существующие символы в строке и строки в тексте.

\ удалить вертикальный блок из текста
\ вернуть адрес начала и длину результирующего текста
: del-block ( pos-x pos-y #x #y addr # --> addr # )
;

Автор:  chess [ Вт апр 06, 2010 16:50 ]
Заголовок сообщения: 

Код:
: del-block { a u x y dx dy \ at yt -- a u }
  a TO at u 0
  DO I a + C@ 0xA =
     IF yt y y dy + WITHIN
        IF at x + dx +  at x +  u at x + a - - MOVE
           dx NEGATE R@ + RP@ !
        THEN
        a I 1+ + TO at yt 1+ TO yt
     THEN
     yt 1+ y dy + >
     IF LEAVE THEN
  LOOP a u dy dx * - ;


\ EOF

: cr!
  S" 0x0A0D SWAP 2R@ DROP + W!" EVALUATE ; IMMEDIATE

: s1
  S" 01234..56789..ABCDRTTY..RWRWRT.."
\         5      12        22      30
  2>R 5 cr! 12 cr! 22 cr! 30 cr! 2R>  ;


s1 TYPE CR

s1 1 1 2 3 del-block  TYPE


LOG
Код:
01234
56789
ABCDRTTY
RWRWRT

01234
589
ADRTTY
RWRT

Ok

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/