
冒頭に掲げましたるman pageの末尾のお言葉、投げやりな感じもするけれど、カッケー。一度そういうことを書いてみたかったデス。今回のGNU Readlineライブラリは多分毎日お世話になっているけれど、ライブラリとして使ってみるのは多分初めて。GPLv3なので避ける方も多いと。大人の事情ってやつね。
※「ソフトな忘却力」投稿順 Index はこちら
※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。
ライブラリのインストール状況
そもそも bash からしてreadlineを使っている筈なので、ライブラリそのものはインストールしてある筈。調べてみると以下のごとし。
readline-commonはデフォルトで入っておると。しかし-docは入っておらず、そして、以下のように-devもなしっと。
よって、今回は、-devと-docを apt から入れさせていただくところから始めました。さすれば
info readline
でドキュメントなど読み放題?であります。
超簡単なサンプルプログラム作成
上記 info を参照させていただき、以下作成いたしました。
-
- プロンプト >>> を表示して1行入力。
- 入力行の先頭が . で始まっていたら脱出。
- .以外であれば入力行をそのまま[ と ] で挟んで表示。
こんな感じであります。
#include <stdio.h>
#include <stdlib.h>
#include <readline/readline.h>
#include <readline/history.h>
static char *line_read = (char *)NULL;
void freeLineRead()
{
if (line_read) {
free(line_read);
line_read = (char*)NULL;
}
}
char* rl_gets()
{
freeLineRead();
line_read = readline(">>> ");
if (line_read && *line_read) {
add_history(line_read);
}
return (line_read);
}
int main(int argc, char const *argv[])
{
char *buf = (char *)NULL;
int flag = 1;
while (flag) {
buf = rl_gets();
if (*buf == '.') {
flag = 0;
}
printf("[%s]\n", buf);
}
freeLineRead();
return 0;
}
ビルドして実行
ビルドは例によって pkg-configの出番であります。
gcc -g -Wall -O0 tstreadline.c $(pkg-config --cflags --libs readline)
pkg-configにお任せすればリンカのエラーなどに困りませぬな。ホントか?
スクリーンショットなのでカーソルの動きなどは見えませぬが行入力できましたぞ。しかし、上記はVScodeの中のターミナルウインドウから動作させたので一部の編集シケーンスがエディタに取られてしまうみたいです。ちゃんと行編集機能を確かめるには、普通にターミナルから動かした方が良いようです。やってみたらば各種エスケープキーやコマンド履歴なども動作しているみたい(とても全部は確かめられないけど。)これまた当たり前か。
1行入力できただけで何かコマンドライン・インタプリタでも作りたくなるのはなぜ?気の迷い?

