はじめに
@Mind-Club_2017 さんがQiitaに次の投稿をされて興味を持ちました。
Mind Webアプリケーション(CGI)で「禅の言葉」を得てGoogle翻訳で和訳 #Webアプリケーション
https://qiita.com/Mind-Club_2017/items/ba2c4473706ba1fd7f59
上記で紹介されたプログラムでは、Webからのデータ取得にcurlを使われていました。
(curlはWindows標準装備だったんですね。知りませんでした)
curlは単なるWebページの取得にかぎらす、Web API として提供されるサービスのアクセスでも使うことができるので、Webページをcurl経由でMind側に取り込むのは汎用性があるのでは思い、ライブラリを作ってみました。
ライブラリのソースコード
ライブラリ
curl受信文字列は 文字列実体 長さ 8192。
curlを実行しデータ取得とは (オプション、URL → 文字列)
オプションは 文字列
URLは 文字列
エラー出力もリダイレクトは 数値 1
起動コマンドは 文字列実体 長さ 256
プロセスIDは 変数
行は 文字列
オプションと URLに 入れ
エラークリアし
curl受信文字列を クリアし
エラー出力もリダイレクト
ならば 子のエラー出力をリダイレクト要求を セットし
つぎに
"curl"を 起動コマンドに 入れ
半角空白を 起動コマンドに 一文字追加し
"--silent"を 起動コマンドに 追加し
半角空白を 起動コマンドに 一文字追加し
オプションが 非空列?
ならば オプションを 起動コマンドに 追加し
半角空白を 起動コマンドに 一文字追加し
つぎに
'"'を 起動コマンドに 一文字追加し
URLを 起動コマンドに 追加し
'"'を 起動コマンドに 一文字追加し
起動コマンドで 子をリダイレクトして子プロセス起動し プロセスIDに 入れ
エラー?
ならば 終り
つぎに
送り書き込みハンドルで ハンドル指定でクローズし
ここから
受け読み出しハンドルで ハンドル指定で一行読み出し 行に 入れ
データ終り?
ならば 打ち切り
つぎに
行を curl受信文字列に 追加し
改行コードを curl受信文字列に 一文字追加し
繰り返し
プロセスIDで 子プロセス終了を待ち
エラー?
ならば エラー文字列で 重大エラー
つぎに
curl受信文字列を 返すこと。
curlのオプションとURLの二つを(いずれも文字列)スタックに積んで「curlを実行しデータ取得」を実行するとデータが返されるという単純な仕様です。
Mindで外部プログラムを実行する処理単語は複数ありますが、「・・実行」ではなく「・・起動」と名のついた処理単語はプロセスのキックだけを行い直ちに戻ってきます。そのあと、ループを組んで子プロセスからのデータを吸い上げることができます。
受信するデータ終わるとパイプからの「一行読み出し」のあとの「データ終り?」が真を返すのでループを脱出します。
ライブラリの機能確認プログラム
ライブラリをテストするサンプルプログラムが以下です(「メインとは」付き)。
テストプログラム
"redirectcurl.src"を コンパイル。
メインとは
受信文字列は 文字列
起動引数個数が 1と 異なる
ならば 「Usage: 」を 表示し
私のプログラム名・短縮を 表示し
「 URL」を 一行表示し
「(注:-L オプションをこのプログラム内で設定します)」を 一行表示し
実行終り
つぎに
「-L」と 起動引数(1)で curlを実行しデータ取得し 受信文字列に 入れ
エラー?
ならば エラー文字列で 重大エラー
つぎに
「--------------」を 一行表示し
受信文字列を 一行表示し
「--------------」を 一行表示し
。
実行結果
うちのサーバ内のテストページ(静的HTML)をURL指定して取得してみました。
>redirectcurlTEST https://www.scripts-lab.co.jp/info.html
--------------
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
</head>
<body bgcolor="#FFFFFF">
GOLD (scripts-lab.co.jp)
</body>
</html>
--------------