冒頭に掲げましたる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行入力できただけで何かコマンドライン・インタプリタでも作りたくなるのはなぜ?気の迷い?