C言語インタプリタ

Meshiが先週参加していたe-learning関係の学会の話を少し聞いた.
C言語インタプリタとかがあると喜ばれるらしいです.軽く探してましたが,良い感じの物はありませんでした.
適当なものならgdbで簡単に作れそうだったので,やってみました.
ただのgdbラッパですが,気持ちの良い動作をさせるのに手間取りました・・・
こんな感じに使えます.

[TOTORO /d/C++Projects/ic] > ./ic.sh
ic> printf("%02X\n", 'A')
41
$1 = 3
ic> puts("hogehoge")
hogehoge
$2 = 10
ic> 3+4
$3 = 7
ic> cos(3.14)
$4 = 639
ic> /f cos(3.14)
$5 = 8.95429719e-43                                                                                                            
[TOTORO /d/C++Projects/ic]                                                                      

浮動小数点だめじゃないか,,,

以下ソース(ライセンスはNYSL)

  • ic.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <signal.h>
    
    void b(){}
    
    int main()
    {
        setvbuf(stdout, 0, _IONBF, 0);
        b();
        return 0;
    }
    
  • in.pl
    #!/usr/bin/perl
    $|=1;
    while(<>)
    {
        chomp;
        if("" eq $_){ next }
        elsif(substr("quit", 0, length($_)) eq $_)
        {
        print "quit";
        exit 0;
        }
        else
        {
        print "p $_\n";
        }
    }
    
  • out.pl
    #!/usr/bin/perl
    $|=1;
    for($i=0;$i<4;$i++){<STDIN>}
    
    while(!eof(STDIN))
    {
        $buf.=getc STDIN;
    
        if(substr("(gdb)", 0, length($buf)) ne $buf)
        {
        print $buf;
        $buf ="";
        }
        elsif($buf eq "(gdb)")
        {
        print "ic>";
        $buf ="";
        }
    }
    
  • x.txt
    br b
    run
    
  • ic.sh
    #!/usr/bin/sh
    perl in.pl | gdb -q -x x.txt a | perl out.pl
    
gcc -g -lm ic.c

のようにコンパイルして

./ic.sh

のように使います.a.outが嫌な場合は,コンパイルのオプションとic.shのaの部分を変えればOKです.

適当すぎですが笑わないでください.
パイプを使うとかっこよくみえるかもしれませんが,めんどくさいのでこのままです.

あると意外に便利な気がします.

早起き

昨日は18時過ぎに目が覚めて,26時過ぎに寝た.
今日は6時前に目が覚めた.

  • うわーい.ありがたく組み込ませてもらうよ NYSL!!!万歳 -- Meshi 2007-09-18 15:24:40 (火)
  • これで俺がやることがなくなってしまった...インターフェイス作るだけ? -- Meshi 2007-09-18 15:29:33 (火)
  • NYSLって明記しときました(笑) Webインターフェースでお願い -- Safii 2007-09-18 22:38:34 (火)

お名前: