Если вы используете полный API любой сложности, вам лучше использовать SWIG (или critcl † ) для связывания. SWIG может выполнять связывание между C API и Tcl с очень небольшим пользовательским вводом (часто почти без). Следует отметить, что API, которые он производит, не очень естественны с точки зрения Tcl (поскольку Tcl не C и имеет разные идиомы).
Тем не менее, если вместо этого вам нужен какой-то способ обработки только самых простых частей определений - всего лишь #define
числовых констант - тогда самый простой способ справиться с этим - немного разобрать регулярные выражения:
proc getDefsFromIncludeFile {filename} {
set defs {}
set f [open $filename]
foreach line [split [read $f] "\n"] {
# Doesn't handle all edge cases, but does do a decent job
if {[regexp {^\s*#\s*define\s+(\w+)\s+([^\s\\]+)} $line -> def val]} {
lappend defs $def [string trim $val "()"]
}
}
close $f
return $defs
}
Это делает достаточно похвальную работу над собственными заголовками Tcl. (Обработка условных определений и вложенных операторов #include
оставлена в качестве упражнения; я предлагаю вам попытаться расположить заголовки C таким образом, чтобы сделать это упражнение ненужным.) Когда я это делаю, извлекаются первые несколько определений:
TCL_ALPHA_RELEASE 0 TCL_BETA_RELEASE 1 TCL_FINAL_RELEASE 2 TCL_MAJOR_VERSION 8
† Critcl - это другой способ связывания Tcl / C, и он работает, внедряя язык C в Tcl. Он может создавать очень естественные интерфейсы Tcl для кода C; Я думаю, это здорово. Однако я не думаю, что это может быть полезно для того, что вы пытаетесь сделать.