Как я могу прочитать сырой код с веб-сайта в 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 )
расширяет данный шаблон.