コマンドラインから直接Cを実行

何となく作ってみた。Cでワンライナー(1liner)っぽいものが書けます。
OSのテストなどでシステムコールを直接呼びたいときなんかは便利かと。perlでsysopenとかやるよりも直接的。

使用方法

ce [-m] [-I sysheader] [-i header] [C-code] [args ...]

  • -m : int main(int argc, char**argv) { 〜 ; return 0; } で囲む。
  • -I header : #include
    を挿入
  • -i header : #include "header" を挿入
  • -v : ソースファイルと実行コマンドを表示
% ce 'main(){puts("Hello,World!");}'
Hello,World!

% ce -m 'puts("Hello,World!")'                         # 上と同じ
Hello,World!

% ce -I stdio.h -m 'printf("%d\n", argc)' arg1 arg2    # ヘッダや引数の指定
3

C-codeを省略または "" にすると、標準入力から読み込みます。
コンパイルオプションはCFLAGS, LDFLAGS環境変数で。コンパイラgcc固定です。


以下ceコマンドのソース(シェルスクリプト)。

#!/bin/bash
TMP_C=/tmp/ce.$$.c
TMP_O=/tmp/ce.$$.out
echo -n > $TMP_C

ADD_MAIN=0
VERBOSE=0
while getopts I:i:mv OPT; do
	case $OPT in
	"I")	echo '#include <'$OPTARG'>' >> $TMP_C;;
	"i")	echo '#include "'$OPTARG'"' >> $TMP_C;;
	"m")	ADD_MAIN=1;;
	"v")	VERBOSE=1;;
	esac
done
shift `expr $OPTIND - 1`

[ $ADD_MAIN = 1 ] && echo 'int main(int argc, char**argv) {' >> $TMP_C
if [ "$1" != "" ]; then
	echo "$1" >> $TMP_C
else
	echo reading source from stdin ...
	cat >> $TMP_C
fi
[ $ADD_MAIN = 1 ] && echo '; return 0; }' >> $TMP_C
[ $VERBOSE = 1 ] && cat $TMP_C
shift 1;
[ $VERBOSE = 1 ] && echo gcc $CFLAGS $LDFLAGS $TMP_C -o $TMP_O \&\& $TMP_O $*
gcc $CFLAGS $LDFLAGS $TMP_C -o $TMP_O && $TMP_O $*
rm -f $TMP_O $TMP_C