2014-01-13 2 views
2

У меня есть приложение C, которое может выполнять сценарии TCL и множество пользовательских команд TCL, которые реализованы на C и зарегистрированы в Tcl_CreateObjCommand. В реализации команды я хочу узнать имя файла сценария TCL, который вызвал мою команду. То есть что-то вроде «info script», но вызывается из C (мне не нужен полный путь, просто имя файла будет достаточным). Единственными параметрами, которые у меня есть в моей команде, являютсяКак получить имя сценария TCL от обработчика C

Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[] 

clientData NULL.

Итак, есть ли функция C, где я могу пройти только Tcl_Interp* и получить имя файла сценария TCL? Или, если этого не существует, безопасно ли вызывать функции Tcl_Eval* из реализации команды TCL, и, таким образом, это будет косвенно рекурсивный вызов.

ответ

3

API-интерфейс для получения этой информации просто:

if (Tcl_Eval(interp, "info script") == TCL_OK) { 
    const char *scriptFile = Tcl_GetString(Tcl_GetObjResult(interp)); 
    // Will be OK until you evaluate another script; copy if necessary 
    // ... 
} else { 
    // Something bad happened; unlikely for just “info script” in a normal interp 
} 

Там нет формального C API для получения имени при выполнении скрипта, так как не требуется так часто. Произведенная строка будет передана команде source (или Tcl_EvalFile() или ее отношениям).

В общем, да, это безопасно вызывать Tcl_Eval из Tcl команд, реализованных в C. Как вы думаете, команда, как if или while или for реализуется?

+0

wow так быстро! Большое вам спасибо, вот что мне нужно. – Radagast

Смежные вопросы