# 日報(2023-04-15) C で正規表現を使う時は GLIB を使うと少し楽
掲題の件、べつに正規表現に限らず C でなんか書く時で GLIB が使える時は使ったほうが少し楽に感じます
# 背景
C でなんか書くのはちょっとめんどくさいです。めんどくさい、というネガティブな私の主観は経験のなかで積み重なってきてしまったものなので理屈で考えてるわけでもないのですが、あえて理屈をつけてリストアップしてみると
- 適切なバッファを確保したり解放したりするのが面倒
- クラスライブラリではなくただのライブラリなので、大量な関数の中からら探すのが面倒
- 引数にデフォルト値がないので引数の数が多くて面倒
後、動的な言語が好きなものぐささんなので静的な言語に伴うめんどくささもあるのですが、それは go でも同じなので省略しますね
最初の奴はかなり深刻で、最適なバッファサイズを都度計算して malloc して free して、ってやってるとどっかでリークしそうで怖いので、ちょっと大きめのバッファを静的に用意してまあこれぐらいあればヨシ!って現場猫しててエンバグしてる諸兄諸姉も多いのではないでしょうか ^^;
# GLIB の REGEX
GLIB がいいなぁ、と思う所は多々あるのですが、適切なバッファの確保を ライブラリがやってくれる ところがほんとありがたくて、正規表現を使う時もそうで、例えば Raspberrypi だと tvservice -s
ってコマンドが
state 0xa [HDMI CEA (16) RGB lim 16:9], 1920x1080 @ 60.00Hz, progressive
って感じで画面の物理的なサイズを返してくれますので、これを読み込んで(コードでは省略してますが g_spawn_command_line_sync で読むと楽です)そこから縦と横の画面サイズをパースするのもこんな感じ
#include <gtk/gtk.h>
int displaysize (gint *width, gint *height){
// spawn "tvservice -s" command and receive result to standard_output
// ommit detail
gchar *standard_output = NULL;
// parse width and height string
GRegex *regex;
GMatchInfo *match_info;
regex = g_regex_new ("([0-9]+),([0-9]+)", 0, 0, &error);
if (!result){ // error handling
g_print("err: %s\n", error->message);
g_print("err: %d\n", error->code);
g_error_free (error);
return error->code;
}
g_regex_match (regex, standard_output, 0, &match_info);
g_free(standard_output);
// whether the previous match operation succeeded
if (g_match_info_matches (match_info)){
gchar *zero = g_match_info_fetch (match_info, 0);
g_print("match: %s\n", zero);
gchar *x = g_match_info_fetch (match_info, 1);
gchar *y = g_match_info_fetch (match_info, 2);
*width = g_ascii_strtoll(x, NULL, 10);
*height = g_ascii_strtoll(y, NULL, 10);
g_free(x)
g_free(y)
return 0;
} else {
return 1;
}
}
7行目の g_regex_new()
で正規表現をコンパイルして、15行目の g_regex_match
で正規表現とマッチさせるだけで結果に必要なバッファの確保は中でやってくれてて、後は g_match_info_fetch
でマッチした部分文字列をとれます
# 蛇足
GLIB はドキュメントがしっかりしてる (opens new window) ので、蛇足ながらめんどくさい 2番目と3番目の理由も結構緩和されてるように感じます
逆に言うと私はドキュメントのひどいライブラリを使ってきた経験で C が億劫になっちゃったのかも
# 感想
C で書く時は GLIB 使うとちょっと嬉しいです