ソフトな忘却力(31) GNU Readlineライブラリを使ってみる

Joseph Halfmoon

冒頭に掲げましたるman pageの末尾のお言葉、投げやりな感じもするけれど、カッケー。一度そういうことを書いてみたかったデス。今回のGNU Readlineライブラリは多分毎日お世話になっているけれど、ライブラリとして使ってみるのは多分初めて。GPLv3なので避ける方も多いと。大人の事情ってやつね。

※「ソフトな忘却力」投稿順 Index はこちら

※実行確認はWindows11上のWSL2にのせてあるUbuntu20.04LTSで行ってます。

ライブラリのインストール状況

そもそも bash からしてreadlineを使っている筈なので、ライブラリそのものはインストールしてある筈。調べてみると以下のごとし。aptSearch1

readline-commonはデフォルトで入っておると。しかし-docは入っておらず、そして、以下のように-devもなしっと。aptSearch0

よって、今回は、-devと-docを apt から入れさせていただくところから始めました。さすれば

info readline

でドキュメントなど読み放題?であります。

超簡単なサンプルプログラム作成

上記 info を参照させていただき、以下作成いたしました。

    1. プロンプト >>> を表示して1行入力。
    2. 入力行の先頭が . で始まっていたら脱出。
    3. .以外であれば入力行をそのまま[ と ] で挟んで表示。

こんな感じであります。

#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にお任せすればリンカのエラーなどに困りませぬな。ホントか?

さて実行とな。readlineSample

 

 

スクリーンショットなのでカーソルの動きなどは見えませぬが行入力できましたぞ。しかし、上記はVScodeの中のターミナルウインドウから動作させたので一部の編集シケーンスがエディタに取られてしまうみたいです。ちゃんと行編集機能を確かめるには、普通にターミナルから動かした方が良いようです。やってみたらば各種エスケープキーやコマンド履歴なども動作しているみたい(とても全部は確かめられないけど。)これまた当たり前か。

1行入力できただけで何かコマンドライン・インタプリタでも作りたくなるのはなぜ?気の迷い?

ソフトな忘却力(30) SQLite3をC言語から使う。Amalgamationって何よ。 へ戻る

ソフトな忘却力(32) NCURSES、New Cursesライブラリを使ってみる へ進む