Как прочитать необработанный код с веб-сайта в Gforth?

Я хотел бы слово, как

read-site ( add n buff max -- n flag )

где «добавить n» — это буфер имени сайта, «buff max» — это буфер, в который должен быть прочитан текст ASCII, «n» — это количество прочитанных байтов, а flag истинно, если операция выполнена успешно.

Возможно ли это в Gforth в Linux, Android или Windows?


person Lehs    schedule 02.02.2018    source источник
comment
вы можете получить содержимое сайта в виде локального файла (или блока памяти), а затем использовать что-то вроде: строки чтения (fileid --) begin pad max-line третья строка чтения throw while pad swap (fileid c-addr u) \ string исключает новую строку 2drop repeat 2drop ; чтобы прочитать это... может быть... что именно вы ожидаете получить от сайтов?   -  person francois P    schedule 02.02.2018
comment
@francoisP: я хочу собрать данные для анализа. :)   -  person Lehs    schedule 03.02.2018
comment
@francoisP: У меня также есть идея разработать собственную функцию поиска в Forth. Некоторые сайты действительно ценны (если отфильтровать мусор), но почти все поисковые функции слишком ограничены.   -  person Lehs    schedule 03.02.2018


Ответы (1)


Просто список подходов

Самый простой правильный способ - использовать библиотеку HTTP-клиента (или привязку) в Forth (если есть). Похоже, что такая библиотека есть в репозитории Gforth — см. https://github.com/earl/gforth-mirror/blob/master/netlib/httpclient.fs. Очевидно, что он не работает с HTTPS.

Следующий способ — использовать подходящую внешнюю общую библиотеку, например libcurl. Это известный инструмент, поддерживающий множество протоколов (связку и некоторые примеры использования можно найти также в SP-Forth).

Следующий способ — использовать системный вызов и создать дочерний процесс (не такой эффективный подход с точки зрения использования ресурсов). Gforth имеет system< /a> слово для этого. Пример использования:

S" curl http://example.com/" system

HTML-код веб-страницы будет выведен на стандартный вывод. К сожалению, перенаправление с помощью outfile-execute не работает. работать в этом случае (выглядит как неполная или слабая реализация слова system).

Итак, следует использовать временный файл:

S" curl --silent http://example.com/ > tmp" system

После этого содержимое файла может быть прочитано в заданный буфер.

Концептуальная реализация выглядит следующим образом:

: read-url ( d-buffer d-txt-url -- d-txt-webpage )
  s" curl --silent {} > tmp" interpolate system
  over >r \ keep buf addr
  s" tmp" open-file throw dup >r read-file throw
  r> close-file throw
  r> swap
;

где interpolate ( i*x d-txt1 -- d-txt2 ) расширяет данный шаблон.

person ruvim    schedule 02.02.2018
comment
Да, наряду с HTTPS, cURL также поддерживает FTP, SCP и многие другие протоколы, см. официальный сайт. - person ruvim; 03.02.2018
comment
Большой! Кстати, можно ли как-то загрузить SP-Forth для Ubuntu? - person Lehs; 03.02.2018
comment
Ваша концепция работает для GForth под Ubuntu, но не для Android. Спасибо еще раз! - person Lehs; 03.02.2018
comment
Чтобы установить SP-Forth в Ubuntu, используйте старый deb-пакет из spf.sf.net. - person ruvim; 04.02.2018