The '''Tcl C API''' (also called' Tcl library' or' Tcl C interface') is a set of public functions which can be used to create binary extensions to the [Tcl] language. The Tcl C API provides a portable framework in the spirit of the [https://apr.apache.org/%|%Apache Portable Runtime] and [https://wiki.gnome.org/Projects/GLib%|%Glib]. ** Documentation ** [https://www.tcl.tk/man/tcl/TclLib/contents.htm%|%latest]: [http://www.tcl.tk/man/tcl8.4/TclLib/contents.htm%|%Version 8.4]: [http://www.tcl.tk/man/tcl8.5/TclLib/contents.htm%|%Version 8.5]: [http://www.tcl.tk/man/tcl8.6/TclLib/contents.htm%|%Version 8.6]: ** Description ** Tcl can be regarded as a powerful configuration language sitting on top of a bunch of [C] functions. Tcl's original purpose (according to Tcl's inventor John Ousterhout (see [How do I use the Tcl C API?])), was to create a standard language that could be embedded in applications. Today, the typical use is via the [tclsh] or [wish] interpreters at the scripting level. In some sense, even this usage is a form of embedding Tcl into a larger application that does nothing more than provide a [repl] for the embedded interpreter. The new functions that were added in Tcl 8.5 are listed in: [Tcl/Tk 8.5: New public C routines] Many of the API functions make use of the `[Tcl_Obj]` structure that was introduced in Tcl 8.0. ** General usage notes ** The file tcl.h should be considered a public declaration of the Tcl C functions, defines/macros, and structures which a developer can ''safely'' depend on. (Some [extension]s also use things from tclInt.h, but the price for that is that they require more maintenance in order to keep working. Stick with tcl.h as long as possible.) Most of the actual function declarations are found in the tclDecls.h file; this has to do with the [Stubs] mechanism. [LV]: When I look in tcl.h, I see only 3 functions listed, along with 2 tcl related #include lines - tclDecls.h and tclPlatDecls.h. Is it correct to assume that the nearly 600 functions declared as EXTERN in the two additional files (in Tcl 8.5) are all considered a part of the public [API] for Tcl? ---- Prior to Tcl version 8, the C interface for Tcl commands was string-oriented. This resulted in a lot of conversions between a string representation and other representations such as integers, doubles, lists, so in Tcl 8 included a new interface based on the [Tcl_Obj] C type, which in addition to a string representation can also store an internal representation, and which performs the necessary conversions between types as needed. This helped to speed up Tcl and made scripts run more efficiently. Some functions in the API that accept Tcl_Obj argument instead of string arguments include "Obj" in their name. For example, the ''name1'' and ''name2'' arguments to `Tcl_GetVar2()` are of type ''const char *'', whereas the ''part1ptr'' and ''part2Ptr'' argumetns to `Tcl_ObjGetVar2()` are of type ''Tcl_Obj *''. Some functions that do not include "Obj" in their name nevertheless take Tcl_Obj arguments. One example is `[Tcl_GetString%|%Tcl_GetString()]`. Its counterpart, `[Tcl_GetStringFromObj%|%Tcl_GetStringFromObj()]` additionally provides to the caller the length of the resulting string. ** C function list ** The following list may not be comprehensive, but the Tcl C API functions include: * Tcl_Main * Tcl_SetVar * TclFreeObj * TclTomMathInitializeStubs * Tcl_Access * [Tcl_AddErrorInfo] * Tcl_AddObjErrorInfo * Tcl_AlertNotifier * [Tcl_Alloc] * Tcl_AllocStatBuf * Tcl_AllowExceptions * Tcl_AppendAllObjTypes * Tcl_AppendElement * Tcl_AppendExportList * Tcl_AppendFormatToObj * Tcl_AppendLimitedToObj * Tcl_AppendObjToErrorInfo * Tcl_AppendObjToObj * Tcl_AppendPrintfToObj * Tcl_AppendResult * Tcl_AppendResultVA * Tcl_AppendStringsToObj * Tcl_AppendStringsToObjVA * Tcl_AppendToObj * Tcl_AppendUnicodeToObj * Tcl_AppInit * Tcl_AsyncCreate * Tcl_AsyncDelete * Tcl_AsyncInvoke * Tcl_AsyncMark * Tcl_AsyncReady * [Tcl_AttemptAlloc] * Tcl_AttemptDbCkalloc * Tcl_AttemptDbCkrealloc * Tcl_AttemptRealloc * Tcl_AttemptSetObjLength * Tcl_BackgroundError * Tcl_Backslash * Tcl_BadChannelOption * Tcl_CallWhenDeleted * Tcl_CancelIdleCall * Tcl_Chdir * Tcl_ClearChannelHandlers * Tcl_Close * Tcl_CommandComplete * Tcl_CommandTraceInfo * [Tcl_Concat] * Tcl_ConcatObj * Tcl_ConditionFinalize * Tcl_ConditionNotify * Tcl_ConditionWait * Tcl_ConvertCountedElement * Tcl_ConvertElement * [Tcl_ConvertToType] * Tcl_CreateAlias * Tcl_CreateAliasObj * Tcl_CreateChannel * [Tcl_CreateChannelHandler] * Tcl_CreateCloseHandler * Tcl_CreateCommand * Tcl_CreateEncoding * Tcl_CreateEnsemble * [Tcl_CreateEventSource] * Tcl_CreateExitHandler * Tcl_CreateFileHandler * Tcl_CreateHashEntry * Tcl_CreateInterp * Tcl_CreateMathFunc * Tcl_CreateNamespace * [Tcl_CreateObjCommand] * Tcl_CreateObjTrace * Tcl_CreateSlave * Tcl_CreateThread * Tcl_CreateThreadExitHandler * [Tcl_CreateTimerHandler] * Tcl_CreateTrace * Tcl_CutChannel * Tcl_DeleteAssocData * Tcl_DeleteChannelHandler * Tcl_DeleteCloseHandler * Tcl_DeleteCommand * Tcl_DeleteCommandFromToken * Tcl_DeleteEvents * Tcl_DeleteEventSource * Tcl_DeleteExitHandler * Tcl_DeleteFileHandler * Tcl_DeleteFileHandler * Tcl_DeleteHashEntry * Tcl_DeleteHashTable * Tcl_DeleteInterp * Tcl_DeleteNamespace * Tcl_DeleteThreadExitHandler * Tcl_DeleteTimerHandler * Tcl_DeleteTrace * Tcl_DetachChannel * Tcl_DetachPids * Tcl_DetachPids * Tcl_DetachPids * Tcl_DictObjDone * Tcl_DictObjFirst * Tcl_DictObjGet * Tcl_DictObjNext * Tcl_DictObjPut * Tcl_DictObjPutKeyList * Tcl_DictObjRemove * Tcl_DictObjRemoveKeyList * Tcl_DictObjSize * Tcl_DiscardInterpState * Tcl_DiscardResult * Tcl_DontCallWhenDeleted * [Tcl_DoOneEvent] * [Tcl_DoWhenIdle] * [DString%|%Tcl_DStringAppend] * [DString%|%Tcl_DStringAppendElement] * [dString%|%Tcl_DStringEndSublist] * [dString%|%Tcl_DStringFree] * [dString%|%Tcl_DStringGetResult] * [dString%|%Tcl_DStringInit] * [dString%|%Tcl_DStringResult] * [dString%|%Tcl_DStringSetLength] * [dString%|%Tcl_DStringStartSublist] * Tcl_DumpActiveMemory * Tcl_DuplicateObj * Tcl_Eof * Tcl_ErrnoId * Tcl_ErrnoMsg * [Tcl_Eval] * Tcl_EvalEx * Tcl_EvalFile * Tcl_EvalObj * Tcl_EvalObjEx * [Tcl_EvalObjv] * Tcl_EvalTokens * Tcl_EvalTokensStandard * Tcl_EventuallyFree * Tcl_Exit * Tcl_ExitThread * Tcl_Export * Tcl_ExposeCommand * Tcl_ExprBoolean * Tcl_ExprBooleanObj * Tcl_ExprDouble * Tcl_ExprDoubleObj * Tcl_ExprLong * [Tcl_ExprLongObj] * Tcl_ExprObj * Tcl_ExprString * Tcl_ExternalToUtf * Tcl_ExternalToUtfDString * Tcl_Finalize * Tcl_FinalizeNotifier * Tcl_FinalizeThread * Tcl_FindCommand * Tcl_FindEnsemble * Tcl_FindExecutable * Tcl_FindHashEntry * Tcl_FindNamespace * Tcl_FirstHashEntry * Tcl_Flush * Tcl_ForgetImport * Tcl_Format * Tcl_Free * Tcl_FreeEncoding * Tcl_FreeParse * Tcl_FreeResult * Tcl_FSAccess * Tcl_FSChdir * Tcl_FSConvertToPathType * Tcl_FSCopyDirectory * Tcl_FSCopyFile * Tcl_FSCreateDirectory * Tcl_FSData * Tcl_FSDeleteFile * Tcl_FSEqualPaths * Tcl_FSEvalFile * Tcl_FSEvalFileEx * Tcl_FSFileAttrsGet * Tcl_FSFileAttrsSet * Tcl_FSFileAttrStrings * Tcl_FSFileSystemInfo * Tcl_FSGetCwd * Tcl_FSGetFileSystemForPath * Tcl_FSGetInternalRep * [Tcl_FSGetNativePath] * Tcl_FSGetNormalizedPath * Tcl_FSGetPathType * Tcl_FSGetTranslatedPath * Tcl_FSGetTranslatedStringPath * Tcl_FSJoinPath * Tcl_FSJoinToPath * Tcl_FSLink * Tcl_FSListVolumes * Tcl_FSLoadFile * Tcl_FSLstat * Tcl_FSMatchInDirectory * Tcl_FSMountsChanged * Tcl_FSNewNativePath * Tcl_FSOpenFileChannel * Tcl_FSPathSeparator * Tcl_FSRegister * Tcl_FSRemoveDirectory * Tcl_FSRenameFile * Tcl_FSSplitPath * Tcl_FSStat * Tcl_FSUnregister * Tcl_FSUtime * Tcl_GetAlias * Tcl_GetAliasObj * Tcl_GetAllocMutex * Tcl_GetAssocData * Tcl_GetBignumFromObj * Tcl_GetBoolean * Tcl_GetBooleanFromObj * Tcl_GetByteArrayFromObj * Tcl_GetChannel * Tcl_GetChannelBufferSize * Tcl_GetChannelError * Tcl_GetChannelErrorInterp * Tcl_GetChannelHandle -> see also [Tcl_GetChannelHandle() forward compatibility] * Tcl_GetChannelInstanceData * Tcl_GetChannelMode * Tcl_GetChannelName * Tcl_GetChannelNames * Tcl_GetChannelNamesEx * Tcl_GetChannelOption * Tcl_GetChannelThread * Tcl_GetChannelType * Tcl_GetCharLength * Tcl_GetCommandFromObj * Tcl_GetCommandFullName * Tcl_GetCommandInfo * Tcl_GetCommandInfoFromToken * Tcl_GetCommandName * Tcl_GetCurrentNamespace * Tcl_GetCurrentThread * Tcl_GetCwd * Tcl_GetDefaultEncodingDir * Tcl_GetDouble * Tcl_GetDoubleFromObj * Tcl_GetEncoding * Tcl_GetEncodingFromObj * Tcl_GetEncodingName * Tcl_GetEncodingNameFromEnvironment * Tcl_GetEncodingNames * Tcl_GetEncodingSearchPath * Tcl_GetEnsembleFlags * Tcl_GetEnsembleMappingDict * Tcl_GetEnsembleNamespace * Tcl_GetEnsembleSubcommandList * Tcl_GetEnsembleUnknownHandler * Tcl_GetErrno * Tcl_GetGlobalNamespace * Tcl_GetHostName * Tcl_GetIndexFromObjStruct * Tcl_GetInt * Tcl_GetInterpPath * [Tcl_GetIntFromObj] * [Tcl_GetIndexFromObj] * Tcl_GetLongFromObj * Tcl_GetMaster * Tcl_GetMathFuncInfo * Tcl_GetMemoryInfo * Tcl_GetNameOfExecutable * Tcl_GetNamespaceUnknownHandler * [Tcl_GetObjResult] * Tcl_GetObjType * Tcl_GetOpenFile * Tcl_GetOpenFile * Tcl_GetPathType * Tcl_GetRange * Tcl_GetRegExpFromObj * Tcl_GetReturnOptions * Tcl_Gets * Tcl_GetServiceMode * Tcl_GetSlave * Tcl_GetsObj * Tcl_GetStackedChannel * Tcl_GetStdChannel * Tcl_GetString * Tcl_GetStringFromObj * Tcl_GetStringResult -> see also [Tcl_GetStringResult() forward compatibility] * Tcl_GetThreadData * Tcl_GetTime * Tcl_GetTopChannel * Tcl_GetUniChar * Tcl_GetUnicode * Tcl_GetUnicodeFromObj * Tcl_GetVar * Tcl_GetVar2 * Tcl_GetVar2Ex * Tcl_GetVersion * Tcl_GetWideIntFromObj * Tcl_GlobalEval * Tcl_GlobalEvalObj * Tcl_HashStats * Tcl_HideCommand * Tcl_Import * [Tcl_Init] * Tcl_InitBignumFromDouble * Tcl_InitCustomHashTable * Tcl_InitHashTable * Tcl_InitMemory * Tcl_InitNotifier * Tcl_InitObjHashTable * [Tcl_InitStubs] * Tcl_InputBlocked * Tcl_InputBuffered * Tcl_InterpDeleted * Tcl_InvalidateStringRep * Tcl_IsChannelExisting * Tcl_IsChannelRegistered * Tcl_IsChannelShared * Tcl_IsEnsemble * Tcl_IsSafe * Tcl_IsStandardChannel * Tcl_JoinPath * Tcl_JoinThread * Tcl_LimitAddHandler * Tcl_LimitCheck * Tcl_LimitExceeded * Tcl_LimitGetCommands * Tcl_LimitGetGranularity * Tcl_LimitGetTime * Tcl_LimitReady * Tcl_LimitRemoveHandler * Tcl_LimitSetCommands * Tcl_LimitSetGranularity * Tcl_LimitSetTime * Tcl_LimitTypeEnabled * Tcl_LimitTypeExceeded * Tcl_LimitTypeReset * Tcl_LimitTypeSet * Tcl_LinkVar * Tcl_ListMathFuncs * Tcl_ListObjAppendElement * Tcl_ListObjAppendList * Tcl_ListObjGetElements * Tcl_ListObjIndex * Tcl_ListObjLength * [Tcl_ListObjReplace] * Tcl_LogCommandInfo * Tcl_MacOSXOpenBundleResources * Tcl_MacOSXOpenVersionedBundleResources * Tcl_MakeFileChannel * Tcl_MakeSafe * Tcl_MakeTcpClientChannel * [Tcl_Merge] * Tcl_MutexFinalize * Tcl_MutexLock * Tcl_MutexUnlock * Tcl_NewBignumObj * Tcl_NewBooleanObj * [Tcl_NewByteArrayObj] * Tcl_NewDictObj * Tcl_NewDoubleObj * Tcl_NewIntObj * [Tcl_NewListObj] * Tcl_NewLongObj * [Tcl_NewObj] * [Tcl_NewStringObj] * Tcl_NewUnicodeObj * Tcl_NewWideIntObj * Tcl_NextHashEntry * [Tcl_NotifyChannel] * Tcl_NumUtfChars * Tcl_ObjGetVar2 * Tcl_ObjPrintf * Tcl_ObjSetVar2 * Tcl_OpenCommandChannel * Tcl_OpenCommandChannel * Tcl_OpenCommandChannel * Tcl_OpenFileChannel * Tcl_OpenTcpClient * Tcl_OpenTcpServer * Tcl_OutputBuffered * Tcl_Panic * Tcl_PanicVA * Tcl_ParseBraces * [Tcl_ParseCommand] * Tcl_ParseExpr * Tcl_ParseQuotedString * [Tcl_ParseVar] * Tcl_ParseVarName * Tcl_PkgInitStubsCheck * Tcl_PkgPresent -> see also [Tcl_PkgPresent() forward compatibility] * Tcl_PkgPresentEx * Tcl_PkgProvide * Tcl_PkgProvideEx * [Tcl_PkgRequire] * Tcl_PkgRequireEx * Tcl_PkgRequireProc * Tcl_PosixError * Tcl_Preserve * Tcl_PrintDouble * Tcl_ProcObjCmd * Tcl_PutEnv * Tcl_QueryTimeProc * Tcl_QueueEvent * Tcl_Read * Tcl_ReadChars * Tcl_ReadRaw * Tcl_Realloc * Tcl_ReapDetachedProcs * Tcl_ReapDetachedProcs * Tcl_ReapDetachedProcs * Tcl_RecordAndEval * Tcl_RecordAndEvalObj * Tcl_RegExpCompile * Tcl_RegExpExec * Tcl_RegExpExecObj * Tcl_RegExpGetInfo * Tcl_RegExpMatch * Tcl_RegExpMatchObj * Tcl_RegExpRange * Tcl_RegisterChannel * Tcl_RegisterConfig * [Tcl_RegisterObjType] * Tcl_Release * [Tcl_ResetResult] * Tcl_RestoreInterpState * Tcl_RestoreResult * Tcl_SaveInterpState * Tcl_SaveResult -> see also [Tcl_SaveResult() forward compatibility] * Tcl_ScanCountedElement * Tcl_ScanElement * Tcl_Seek * Tcl_SeekOld * Tcl_ServiceAll * Tcl_ServiceEvent * Tcl_ServiceModeHook * Tcl_SetAssocData * Tcl_SetBignumObj * Tcl_SetBooleanObj * Tcl_SetByteArrayLength * Tcl_SetByteArrayObj * Tcl_SetChannelBufferSize * Tcl_SetChannelError * Tcl_SetChannelErrorInterp * Tcl_SetChannelOption * Tcl_SetCommandInfo * Tcl_SetCommandInfoFromToken * Tcl_SetDefaultEncodingDir * Tcl_SetDoubleObj * Tcl_SetEncodingSearchPath * Tcl_SetEnsembleFlags * Tcl_SetEnsembleMappingDict * Tcl_SetEnsembleSubcommandList * Tcl_SetEnsembleUnknownHandler * Tcl_SetErrno * Tcl_SetErrorCode * Tcl_SetErrorCodeVA * Tcl_SetExitProc * Tcl_SetIntObj * Tcl_SetListObj * Tcl_SetLongObj * Tcl_SetMainLoop * Tcl_SetMaxBlockTime * Tcl_SetNamespaceUnknownHandler * Tcl_SetNotifier * Tcl_SetObjErrorCode * Tcl_SetObjLength * [Tcl_SetObjResult] * Tcl_SetPanicProc * Tcl_SetRecursionLimit * Tcl_SetResult * Tcl_SetReturnOptions * Tcl_SetServiceMode * Tcl_SetStdChannel * Tcl_SetStringObj * Tcl_SetSystemEncoding * Tcl_SetTimeProc * Tcl_SetTimer * Tcl_SetUnicodeObj * Tcl_SetVar2 * Tcl_SetVar2Ex * Tcl_SetWideIntObj * Tcl_SignalId * Tcl_SignalMsg * Tcl_Sleep * Tcl_SourceRCFile * Tcl_SpliceChannel * Tcl_SplitList * Tcl_SplitPath * Tcl_StackChannel * Tcl_Stat * Tcl_StaticPackage * Tcl_StringCaseMatch * Tcl_StringMatch * Tcl_SubstObj * Tcl_TakeBignumFromObj * Tcl_Tell * Tcl_TellOld * Tcl_ThreadAlert * Tcl_ThreadQueueEvent * Tcl_TraceCommand * Tcl_TraceVar * Tcl_TraceVar2 * Tcl_TranslateFileName * Tcl_TruncateChannel * Tcl_Ungets * Tcl_UnlinkVar * Tcl_UnregisterChannel * Tcl_UnsetVar * Tcl_UnsetVar2 * Tcl_UnstackChannel * Tcl_UntraceCommand * Tcl_UntraceVar * Tcl_UntraceVar2 * Tcl_UpdateLinkedVar * Tcl_UpVar * Tcl_UpVar2 * Tcl_ValidateAllMemory * [Tcl_VarEval] * Tcl_VarEvalVA * Tcl_VarTraceInfo * Tcl_VarTraceInfo2 * Tcl_WaitForEvent * Tcl_WaitPid * Tcl_WinTCharToUtf * Tcl_WinUtfToTChar * Tcl_Write * Tcl_WriteChars * Tcl_WriteObj * Tcl_WriteRaw * [Tcl_WrongNumArgs] ****Db**** * Tcl_DbCkalloc * Tcl_DbCkfree * Tcl_DbCkrealloc * Tcl_DbDecrRefCount * Tcl_DbIncrRefCount * Tcl_DbIsShared * Tcl_DbNewBignumObj * Tcl_DbNewBooleanObj * Tcl_DbNewByteArrayObj * Tcl_DbNewDictObj * Tcl_DbNewDoubleObj * Tcl_DbNewListObj * Tcl_DbNewLongObj * Tcl_DbNewObj * Tcl_DbNewStringObj * Tcl_DbNewWideIntObj ****Unicode**** * Tcl_UniCharAtIndex * Tcl_UniCharCaseMatch * Tcl_UniCharIsAlnum * Tcl_UniCharIsAlpha * Tcl_UniCharIsControl * Tcl_UniCharIsDigit * Tcl_UniCharIsGraph * Tcl_UniCharIsLower * Tcl_UniCharIsPrint * Tcl_UniCharIsPunct * Tcl_UniCharIsSpace * Tcl_UniCharIsUpper * Tcl_UniCharIsWordChar * Tcl_UniCharLen * Tcl_UniCharNcasecmp * Tcl_UniCharNcmp * Tcl_UniCharToLower * Tcl_UniCharToTitle * Tcl_UniCharToUpper * Tcl_UniCharToUtf * Tcl_UniCharToUtfDString ****UTF-8**** * Tcl_UtfAtIndex * Tcl_UtfBackslash * Tcl_UtfCharComplete * Tcl_UtfFindFirst * Tcl_UtfFindLast * Tcl_UtfNcasecmp * Tcl_UtfNcmp * Tcl_UtfNext * Tcl_UtfPrev * Tcl_UtfToExternal * Tcl_UtfToExternalDString * Tcl_UtfToLower * Tcl_UtfToTitle * Tcl_UtfToUniChar * Tcl_UtfToUniCharDString * Tcl_UtfToUpper ****ZLib**** * Tcl_ZlibAdler32 * Tcl_ZlibCRC32 * Tcl_ZlibDeflate * Tcl_ZlibInflate * Tcl_ZlibStreamChecksum * Tcl_ZlibStreamClose * Tcl_ZlibStreamEof * Tcl_ZlibStreamGet * Tcl_ZlibStreamGetCommandName * [Tcl_ZlibStreamInit] * Tcl_ZlibStreamPut ****Tcl C structures**** * [Tcl_ObjType] * [Tcl_StatBuf] **Other notes** [[A list by topic (where related functions are collected together) should be more useful, as the HTML docs already provide this kind of alphabetic list.]] [[Feel free to organize data on the wiki in the way that helps you most - or seems to be most helpful.]] [[Yeap, that is kind of challenging...]] <> Tcl Library