2
* ------------------------------------------------
3
* Copyright 2002 by Bert Raccoon aka Max Artemev
4
* (bert@furry.ru, bert_raccoon@freemail.ru)
5
* ------------------------------------------------
6
* Demo for tcl80.pas unit.
7
* Creating the Tcl interpreter, executing file, registering
8
* new commands, call a function defined in the script.
10
* Under Win32 can cause crash.
17
* Function for testing that string is correct number
19
function is_num(const src: PChar): Boolean;
26
is_num:=is_num and ((src + i)^ in ['0'..'9']);
28
until (src + i)^ = #0;
31
function Test_max(clientData: Tcl_ClientData; {* Some user defined data. *}
32
interp: PTcl_Interp; {* Pointer to Tcl interpreter *}
33
argc: integer; {* Arguments counter, arguments, etc *}
34
argv: Tcl_Argv): longint; {* Remeber! *NIX `integer` type is 16 bit! *}
35
cdecl; {* C calling convention *}
42
maxVal := 0; {* Zero variable. Very stupid comment? ;)) *}
44
{* The `max` can be done with at least two digits
45
* In ArgvItem(argv,0) passed function name
49
Tcl_AppendResult(interp, ['bad # arg: ', ArgvItem(argv,0), ' num1 num2 [..numN]', nil]);
50
{* Under Win32 calling of this function can cause crash *}
52
Test_max:=TCL_ERROR; {* Error was occured *}
56
for idx := 1 to argc-1 do {* In argv[0] passed function name, so
57
* go from the first index, not zero.
60
arg := ArgvItem(argv,idx); {* get an argument *}
61
if (not is_num(arg)) then {* Is right number? *}
63
Tcl_AppendResult(interp,[' "', arg, '" is not a valid integer value']);
64
Test_max:=TCL_ERROR; {* Error was occured *}
67
Value:=StrToInt(arg); {* Convert PChar->Integer *}
68
if (value > maxVal) then
69
maxVal := value; {* Calculate maximum number *}
72
{* Set the result for the our function.
73
* result type always is PChar
75
Tcl_SetResult(interp, PChar(IntToStr(maxVal)), nil);
82
* Old and good known Pascal procedure :)
84
function Test_writeln(clientData: Tcl_ClientData; interp: pTcl_Interp; argc: integer; argv: Tcl_Argv): longint; cdecl;
91
Buff:=Buff + ArgvItem(argv,i); {* work around some bugs *}
101
interp := Tcl_CreateInterp(); {* Create an interpreter *}
102
Tcl_Init(interp); {* Initialize *}
104
{* Register/override in the Tcl engine our new functions *}
105
Tcl_CreateCommand(interp,'max', TTclCmdProc(@Test_max),nil,nil);
106
Tcl_CreateCommand(interp,'writeln',TTclCmdProc(@Test_writeln),nil,nil);
108
code := Tcl_EvalFile(interp,'test.tcl'); {* Execute script *}
109
if (code <> TCL_OK) then {* Is all okay? *}
110
writeln(Tcl_GetStringResult(interp));
112
{* Call a function `foo` defined in the script *}
113
code := Tcl_VarEval(interp,['foo ','1 2 3',nil]);
114
if (code <> TCL_OK) then
115
writeln(Tcl_GetStringResult(interp));
116
Tcl_DeleteInterp(interp); {* Release interpreter *}