Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 22:33

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Задачка для разминки
СообщениеДобавлено: Чт янв 18, 2007 22:41 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Если кому интересно. Драйвер Cisco логи ведет в текстовом файле, окончания строк в котором оформлены довольно интересно -- символами 0х0D 0х0D 0х0A -- видимо для того чтобы читался на обоих платформах. В итоге получается, что между строками вставляется пустая строка. Это достаточно раздражает.
Для упрощения жизни желательно иметь утилиту, которая приводит окончания строк к привычному виду -- 0х0D 0х0A.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 18, 2007 22:55 
Вывод в лог и stdout, чтобы не заморачиваться... Ведь это же разминка...

Код:
REQUIRE FILE ~ac/lib/str4.f
REQUIRE split ~profit/lib/bac4th-str.f
REQUIRE FREEB ~profit/lib/bac4th-mem.f

: notEmpty ( s <--> s ) PRO DUP STR@ NIP ONTRUE CONT ; \ отфильтровывает пустые строки

: load-file ( addr u <--> addr1 u1 ) \ загружаем файл
PRO FILE SWAP FREEB SWAP 2DROPB CONT ;

: iterateStrings ( addr u <--> s ) PRO
load-file 2DUP \ пускаем цикл по строкам файла
byRows   \ функция проверки на перевод строки
split    \ деление на строки
notEmpty \ фильтрация пустых строк
CONT ;   \ передача строки "наверх"

: convertCRLF ( addr u -- )
iterateStrings \ получаем строки
DUP STR@       \ "раскрываем" её до addr u
CR TYPE        \ печатаем в новой строке
;

STARTLOG
S" text.log" convertCRLF


Проверено на SPF 4.18.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 09, 2007 22:05 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Собственный вариант. На написание и отладку ушло 5ч.
Идея проста - все символы 0x0D игнорируем, а вместо символа 0x0A сразу подставляем два символа 0x0D 0x0A
Чтобы упростить задачу -- считываем весь файл в память. Ограничиваемся размером не более 1Mb, для практических задач этого достаточно
Код:
REQUIRE CASE       lib/ext/case.f
REQUIRE NEXT-PARAM ~day/common/clparam.f
\ --------------------------------------------------------------
1 1024 * 1024 * CONSTANT MaxSize
0 VALUE Orig.AddrB
0 VALUE Result.AddrB
0 VALUE Result.Len
0 VALUE FF
\ ------------------ Интерфейсная процедура ---------------------
: help
  S" Convert end line. Usage: " TYPE CR
  S"   conver.exe <Input file> <Output file>" TYPE CR
  BYE
;
: NextParam ( -- addr u )
  NEXT-PARAM  DUP 0= IF help THEN
;
\ --------------------------- Логика ----------------------------
: ResultAdd ( char -- ) \ добавляет в конец массива один байт
   Result.AddrB Result.Len + C!
   Result.Len 1+ TO Result.Len
;
: Init
  MaxSize ALLOCATE THROW TO   Orig.AddrB
  MaxSize ALLOCATE THROW TO Result.AddrB
  NEXT-PARAM 2DROP
;
: LoadFromFile
\ S" cisco.def" R/O OPEN-FILE THROW TO FF
  NextParam R/O OPEN-FILE THROW TO FF
   Orig.AddrB MaxSize FF READ-FILE THROW ( u ) \ кол-во прочитанного
FF CLOSE-FILE DROP
;
: Transform ( u )
0 DO 
   I Orig.AddrB + C@
   DUP CASE
     0x0A OF DROP 0x0D ResultAdd 0x0A ResultAdd  ENDOF
     0x0D OF DROP ENDOF
     ResultAdd
   ENDCASE
LOOP
;
: SaveToFile
\ S" cisco.txt" W/O CREATE-FILE THROW TO FF
NextParam W/O CREATE-FILE THROW TO FF
   Result.AddrB Result.Len FF WRITE-FILE THROW
FF CLOSE-FILE DROP
;

: RUN
  Init LoadFromFile Transform SaveToFile BYE ;

\ --------------------- Компилируем ---------------------------------
0 TO SPF-INIT?
' RUN MAINX !
S" convert.exe" SAVE
BYE 
\ -------------------------------------------------------------------


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 02:23 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
AlexF писал(а):
0х0D 0х0D 0х0A

Для универсальности надо бы еще и другие комбинации предусмотреть :)

0х0D 0х0D 0х0A
0х0D 0х0A 0х0D
0х0A 0х0D 0х0D

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 03:45 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а мой пример короче 8)
Код:
\ 10-04-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ пример очень простой обработки файла.

VOCABULARY process
           ALSO process DEFINITIONS

      \ я не люблю NOTFOUND, но в данном примере он кстати.
      : NOTFOUND ( asc # --> ) 2DROP
                 0 >IN !
                 0x0D PARSE
                 <# 0x0A HOLD 0x0D HOLD HOLDS 0. #>
                 TYPE ;

PREVIOUS DEFINITIONS

\ по-умолчанию сохраняем в STDLOG
: sample ( srcZ # --> )
         ONLY process
         GetCommandLineA ASCIIZ> SOURCE! NextWord 2DROP
         NextWord INCLUDED
         KEY DROP BYE ;

' sample MAINX !

S" sample.exe" SAVE CR S" passed " CR BYE


пример использования:
sample file.name >result.name


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 03:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
mOleg писал(а):
0x0D PARSE
<# 0x0A HOLD 0x0D HOLD HOLDS 0. #>

в этом месте можно еще проще
Код:
0x0D PARSE TYPE CR

- причем результатом будет файл с переносами зависящими от системы, то есть под линухом будет просто 0x0D 8) а под виндой 0x0D 0x0A

Ж8))


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 11:55 
Кто может дать пример управления Visio
C первой попытки не удалось пока разобраться:)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 16:27 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Завоёвывая приз по краткости, понятности и code-reuse'овости
Цитата:
REQUIRE replace-str- ~pinka/samples/2005/lib/replace-str.f
REQUIRE OCCUPY ~pinka/samples/2005/lib/append-file.f

CREATE from 0x0D C, 0x0D C, 0x0A C,
3 VALUE #from

: convert FILE " {s}" DUP " {from #from}" " {CRLF}" replace-str- ;
: to: DUP STR@ PARSE-NAME OCCUPY STRFREE ;


Код:
S" input.txt' convert to: output.txt

_________________
http://forth.org.ru/~ygrek


Последний раз редактировалось ygrek Вт апр 10, 2007 20:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 20:22 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
yGREK писал(а):
REQUIRE replace-str- ~pinka/samples/2005/lib/replace-str.f
REQUIRE OCCUPY ~pinka/samples/2005/lib/append-file.f


зато я обошелся без внешних либ Ж8)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 10, 2007 21:22 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
0х0D 0х0D 0х0A
0х0D 0х0A 0х0D
0х0A 0х0D 0х0D

все чесно. Т.к реагируем только на 0х0A, то
0х0D 0х0D 0х0A --> 0х0A --> 0х0D 0х0A
0х0D 0х0A 0х0D --> 0х0A --> 0х0D 0х0A
0х0A 0х0D 0х0D --> 0х0A --> 0х0D 0х0A


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB