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

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

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

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

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

1 ответ

Решение

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

Наиболее простым и правильным способом должно быть использование библиотеки HTTP-клиента (или привязки) в Forth (если есть). Похоже, что такая библиотека существует в репозитории Gforth - смотрите netlib / httpclient.fs. Очевидно, это не работает с HTTPS.

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

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

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 ) расширяет данный шаблон.

Другие вопросы по тегам