|
/* サンプル271(main関数をもつ独立実行プログラム) */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "tcl.h" /* (1) */
static void application(Tcl_Interp* interp, char* myname);
int main(int argc, char* argv[]){
Tcl_Interp* interp;
char* myname = "Posa";
interp = Tcl_CreateInterp(); /* (2) */
Tcl_FindExecutable(argv[0]); /* (3) */
if(Tcl_Init(interp) == TCL_ERROR){ /* (4) */
fprintf(stderr, "Tcl interpreter initialization failed.\n");
return 1;
}
/* (5) */
application(interp, myname);
Tcl_DeleteInterp(interp);
return 0;
}
static void application(Tcl_Interp* interp, char* myname){
char buf[256];
char* p;
Tcl_SetVar(interp, "name", myname, 0); /* (6) */
strcpy(buf, "set msg \"Hello, World and $name\""); /* (7) */
if(Tcl_Eval(interp, buf) == TCL_ERROR){
fprintf(stderr, "Interpretaion error: %s\n",
Tcl_GetStringResult(interp) ); /* (8) */
return;
}
if((p = Tcl_GetVar(interp, "msg", 0)) != NULL) /* (9) */
fprintf(stderr, "<%s>\n", p);
}
Tcl_EvalEx(*1)は、Tcl_Eval と同じようにコマンドを解釈実行しますが、 Tcl_EvalEx(interp, command, -1, TCL_EVAL_GLOBAL);のように第4引数に記号定数TCL_EVAL_GLOBALを指定すると いつ呼ばれてもグローバルレベルでコマンドを解釈させることができます。 第3引数は通常 strlen(command) を指定しますが、 -1とすると自動的にその値になります。 また一般に、Tcl_EvalEx のほうがTcl_Evalよりも高速です。 このほかに、Tcl_EvalFile というAPIも便利です。これは、Tcl言語のスクリプトファイルを Tcl_EvalFile(interp, filename);のように指定すると、そのファイル全体をsourceコマンドのように読んで実行し、 途中でエラーがなければTCL_OK、エラーがあればそこで止まって TCL_ERRORを返してきます。 (*1)Tcl_EvalExはTcl 8.0〜Tcl 8.1b1までは Tcl_Eval2 という名前でしたが8.1b2で改名されました。 次の例はもっと簡単なプログラムです。 これでTcl_Evalと Tcl_GetStringResult の使い方が理解できれば、いろいろなプログラムが作れることでしょう。
/* サンプル272(main関数をもつ独立実行プログラム) */
#include <stdio.h>
#include "tcl.h"
int main(int argc, char* argv[]){
char command[1024];
Tcl_Interp* interp;
if(argc != 3){
fprintf(stderr, "usage: %s num1 num2\n", argv[0]);
return 1;
}
interp = Tcl_CreateInterp();
sprintf(command, "expr %s+%s\n", argv[1], argv[2]);
if(Tcl_Eval(interp, command) == TCL_ERROR)
fprintf(stderr, "ERROR: %s\n", Tcl_GetStringResult(interp));
else
fprintf(stdout, "%s\n", Tcl_GetStringResult(interp));
return 0;
}
/* end. */
|