text: 
  #include "tcl_globals.h"
  #include "embed.h"
  #include "cpptcl.h"
  
  #include <memory>
  
  namespace py = pybind11;
  
  namespace
  {
  
  Tcl_Interp* get_current_interpreter() {
      return TclPythonGlobals::getInstance().top();
  }
  
  template <class T>
  class ptr_wrapper
  {
      public:
          ptr_wrapper() : ptr(nullptr) {}
          ptr_wrapper(T* ptr) : ptr(ptr) {}
          ptr_wrapper(const ptr_wrapper& other) : ptr(other.ptr) {}
          T* operator->() const { return  ptr; }
          T* get() const { return ptr; }
          void set(T* value) { ptr = value; }
  
          void destroy() { delete ptr; }
      private:
          T* ptr = nullptr;
  };
  
  }
  
  PYBIND11_EMBEDDED_MODULE(ctcl, m) {
      py::class_<Tcl_Interp>(m, "Tcl_Interp");
      py::class_<Tcl_Obj>(m, "Tcl_Obj");
      py::class_<Tcl_ObjType>(m, "Tcl_ObjType");
      py::class_<Tcl_Time>(m, "Tcl_Time");
  
      m.def("get_current_interpreter", get_current_interpreter);
  
      m.def("Tcl_PkgProvideEx", Tcl_PkgProvideEx);
      m.def("Tcl_PkgRequireEx", [](Tcl_Interp *interp, char *name, char *version, int exact, ptr_wrapper<void>& clientDataPtr ) -> int {
          ClientData client_data;
          auto res = Tcl_PkgRequireEx(interp, name, version, exact, &client_data);
          clientDataPtr.set(client_data);
          return 0;
      });
      // m.def("Tcl_Panic", Tcl_Panic);
      m.def("Tcl_Alloc", Tcl_Alloc);
      m.def("Tcl_Free", Tcl_Free);
      m.def("Tcl_Realloc", Tcl_Realloc);
      m.def("Tcl_DbCkalloc", Tcl_DbCkalloc);
      m.def("Tcl_DbCkfree", Tcl_DbCkfree);
      m.def("Tcl_DbCkrealloc", Tcl_DbCkrealloc);
      // m.def("Tcl_CreateFileHandler", Tcl_CreateFileHandler);
      // m.def("Tcl_DeleteFileHandler", Tcl_DeleteFileHandler);
      m.def("Tcl_SetTimer", Tcl_SetTimer);
      m.def("Tcl_Sleep", Tcl_Sleep);
      m.def("Tcl_WaitForEvent", Tcl_WaitForEvent);
      m.def("Tcl_AppendAllObjTypes", Tcl_AppendAllObjTypes);
      // m.def("Tcl_AppendStringsToObj", Tcl_AppendStringsToObj);
      m.def("Tcl_AppendToObj", Tcl_AppendToObj);
      // m.def("Tcl_ConcatObj", Tcl_ConcatObj);
      m.def("Tcl_ConvertToType", Tcl_ConvertToType);
      // m.def("Tcl_DbDecrRefCount", Tcl_DbDecrRefCount);
      // m.def("Tcl_DbIncrRefCount", Tcl_DbIncrRefCount);
      // m.def("Tcl_DbIsShared", Tcl_DbIsShared);
      // m.def("Tcl_DbNewBooleanOb", Tcl_DbNewBooleanOb);
      // m.def("Tcl_DbNewByteArrayObj", Tcl_DbNewByteArrayObj);
      // m.def("Tcl_DbNewDoubleObj", Tcl_DbNewDoubleObj);
      // m.def("Tcl_DbNewListObj", Tcl_DbNewListObj);
      // m.def("Tcl_DbNewLongObj", Tcl_DbNewLongObj);
      // m.def("Tcl_DbNewObj", Tcl_DbNewObj);
      // m.def("Tcl_DbNewStringObj", Tcl_DbNewStringObj);
      // m.def("Tcl_DuplicateObj", Tcl_DuplicateObj);
      // m.def("Tcl_GetBoolean", Tcl_GetBoolean);
      // m.def("Tcl_GetBooleanFromObj", Tcl_GetBooleanFromObj);
      // m.def("Tcl_GetByteArrayFromObj", Tcl_GetByteArrayFromObj);
      // m.def("Tcl_GetDouble", Tcl_GetDouble);
      // m.def("Tcl_GetDoubleFromObj", Tcl_GetDoubleFromObj);
      // m.def("Tcl_GetIndexFromObj", Tcl_GetIndexFromObj);
      // m.def("Tcl_GetInt", Tcl_GetInt);
      // m.def("Tcl_GetIntFromObj", Tcl_GetIntFromObj);
      // m.def("Tcl_GetLongFromObj", Tcl_GetLongFromObj);
      // m.def("Tcl_GetObjType", Tcl_GetObjType);
      // m.def("Tcl_GetStringFromObj", Tcl_GetStringFromObj);
      // m.def("Tcl_InvalidateStringRep", Tcl_InvalidateStringRep);
      // m.def("Tcl_ListObjAppendList", Tcl_ListObjAppendList);
      // m.def("Tcl_ListObjAppendElement", Tcl_ListObjAppendElement);
      // m.def("Tcl_ListObjGetElements", Tcl_ListObjGetElements);
      // m.def("Tcl_ListObjIndex", Tcl_ListObjIndex);
      // m.def("Tcl_ListObjLength", Tcl_ListObjLength);
      // m.def("Tcl_ListObjReplace", Tcl_ListObjReplace);
      // m.def("Tcl_NewBooleanObj", Tcl_NewBooleanObj);
      // m.def("Tcl_NewByteArrayObj", Tcl_NewByteArrayObj);
      // m.def("Tcl_NewDoubleObj", Tcl_NewDoubleObj);
      // m.def("Tcl_NewIntObj", Tcl_NewIntObj);
      // m.def("Tcl_NewListObj", Tcl_NewListObj);
      // m.def("Tcl_NewLongObj", Tcl_NewLongObj);
      // m.def("Tcl_NewObj", Tcl_NewObj);
      // m.def("Tcl_NewStringObj", Tcl_NewStringObj);
      // m.def("Tcl_SetBooleanObj", Tcl_SetBooleanObj);
      // m.def("Tcl_SetByteArrayLength", Tcl_SetByteArrayLength);
      // m.def("Tcl_SetByteArrayObj", Tcl_SetByteArrayObj);
      // m.def("Tcl_SetDoubleObj", Tcl_SetDoubleObj);
      // m.def("Tcl_SetIntObj", Tcl_SetIntObj);
      // m.def("Tcl_SetListObj", Tcl_SetListObj);
      // m.def("Tcl_SetLongObj", Tcl_SetLongObj);
      // m.def("Tcl_SetObjLength", Tcl_SetObjLength);
      // m.def("Tcl_SetStringObj", Tcl_SetStringObj);
      // m.def("Tcl_AddErrorInfo", Tcl_AddErrorInfo);
      // m.def("Tcl_AddObjErrorInfo", Tcl_AddObjErrorInfo);
      // m.def("Tcl_AllowExceptions", Tcl_AllowExceptions);
      // m.def("Tcl_AppendElement", Tcl_AppendElement);
      // m.def("Tcl_AppendResult", Tcl_AppendResult);
      // m.def("Tcl_AsyncCreate", Tcl_AsyncCreate);
      // m.def("Tcl_AsyncDelete", Tcl_AsyncDelete);
      // m.def("Tcl_AsyncInvoke", Tcl_AsyncInvoke);
      // m.def("Tcl_AsyncMark", Tcl_AsyncMark);
      // m.def("Tcl_AsyncReady", Tcl_AsyncReady);
      // m.def("Tcl_BackgroundError", Tcl_BackgroundError);
      // m.def("Tcl_Backslash", Tcl_Backslash);
      // m.def("Tcl_BadChannelOption", Tcl_BadChannelOption);
      // m.def("Tcl_CallWhenDeleted", Tcl_CallWhenDeleted);
      // m.def("Tcl_CancelIdleCall", Tcl_CancelIdleCall);
      // m.def("Tcl_Close", Tcl_Close);
      // m.def("Tcl_CommandComplete", Tcl_CommandComplete);
      // m.def("Tcl_Concat", Tcl_Concat);
      // m.def("Tcl_ConvertElement", Tcl_ConvertElement);
      // m.def("Tcl_ConvertCountedElement", Tcl_ConvertCountedElement);
      // m.def("Tcl_CreateAlias", Tcl_CreateAlias);
      // m.def("Tcl_CreateAliasObj", Tcl_CreateAliasObj);
      // m.def("Tcl_CreateChannel", Tcl_CreateChannel);
      // m.def("Tcl_CreateChannelHandler", Tcl_CreateChannelHandler);
      // m.def("Tcl_CreateCloseHandler", Tcl_CreateCloseHandler);
      // m.def("Tcl_CreateCommand", Tcl_CreateCommand);
      // m.def("Tcl_CreateEventSource", Tcl_CreateEventSource);
      // m.def("Tcl_CreateExitHandler", Tcl_CreateExitHandler);
      // m.def("Tcl_CreateInterp", Tcl_CreateInterp);
      // m.def("Tcl_CreateMathFunc", Tcl_CreateMathFunc);
      // m.def("Tcl_CreateObjCommand", Tcl_CreateObjCommand);
      // m.def("Tcl_CreateSlave", Tcl_CreateSlave);
      // m.def("Tcl_CreateTimerHandler", Tcl_CreateTimerHandler);
      // m.def("Tcl_CreateTrace", Tcl_CreateTrace);
      // m.def("Tcl_DeleteAssocData", Tcl_DeleteAssocData);
      // m.def("Tcl_DeleteChannelHandler", Tcl_DeleteChannelHandler);
      // m.def("Tcl_DeleteCloseHandler", Tcl_DeleteCloseHandler);
      // m.def("Tcl_DeleteCommand", Tcl_DeleteCommand);
      // m.def("Tcl_DeleteCommandFromToken", Tcl_DeleteCommandFromToken);
      // m.def("Tcl_DeleteEvents", Tcl_DeleteEvents);
      // m.def("Tcl_DeleteEventSource", Tcl_DeleteEventSource);
      // m.def("Tcl_DeleteExitHandler", Tcl_DeleteExitHandler);
      // m.def("Tcl_DeleteHashEntry", Tcl_DeleteHashEntry);
      // m.def("Tcl_DeleteHashTable", Tcl_DeleteHashTable);
      // m.def("Tcl_DeleteInterp", Tcl_DeleteInterp);
      // m.def("Tcl_DetachPids", Tcl_DetachPids);
      // m.def("Tcl_DetachPids", Tcl_DetachPids);
      // m.def("Tcl_DeleteTimerHandler", Tcl_DeleteTimerHandler);
      // m.def("Tcl_DeleteTrace", Tcl_DeleteTrace);
      // m.def("Tcl_DontCallWhenDeleted", Tcl_DontCallWhenDeleted);
      // m.def("Tcl_DoOneEvent", Tcl_DoOneEvent);
      // m.def("Tcl_DoWhenIdle", Tcl_DoWhenIdle);
      // m.def("Tcl_DStringAppend", Tcl_DStringAppend);
      // m.def("Tcl_DStringAppendElement", Tcl_DStringAppendElement);
      // m.def("Tcl_DStringEndSublist", Tcl_DStringEndSublist);
      // m.def("Tcl_DStringFree", Tcl_DStringFree);
      // m.def("Tcl_DStringGetResult", Tcl_DStringGetResult);
      // m.def("Tcl_DStringInit", Tcl_DStringInit);
      // m.def("Tcl_DStringResult", Tcl_DStringResult);
      // m.def("Tcl_DStringSetLength", Tcl_DStringSetLength);
      // m.def("Tcl_DStringStartSublist", Tcl_DStringStartSublist);
      // m.def("Tcl_Eof", Tcl_Eof);
      // m.def("Tcl_ErrnoId", Tcl_ErrnoId);
      // m.def("Tcl_ErrnoMsg", Tcl_ErrnoMsg);
      // m.def("Tcl_Eval", Tcl_Eval);
      // m.def("Tcl_EvalFile", Tcl_EvalFile);
      // m.def("Tcl_EvalObj", Tcl_EvalObj);
      // m.def("Tcl_EventuallyFree", Tcl_EventuallyFree);
      // m.def("Tcl_Exit", Tcl_Exit);
      // m.def("Tcl_ExposeCommand", Tcl_ExposeCommand);
      // m.def("Tcl_ExprBoolean", Tcl_ExprBoolean);
      // m.def("Tcl_ExprBooleanObj", Tcl_ExprBooleanObj);
      // m.def("Tcl_ExprDouble", Tcl_ExprDouble);
      // m.def("Tcl_ExprDoubleObj", Tcl_ExprDoubleObj);
      // m.def("Tcl_ExprLong", Tcl_ExprLong);
      // m.def("Tcl_ExprLongObj", Tcl_ExprLongObj);
      // m.def("Tcl_ExprObj", Tcl_ExprObj);
      // m.def("Tcl_ExprString", Tcl_ExprString);
      // m.def("Tcl_Finalize", Tcl_Finalize);
      // m.def("Tcl_FindExecutable", Tcl_FindExecutable);
      // m.def("Tcl_FirstHashEntry", Tcl_FirstHashEntry);
      // m.def("Tcl_Flush", Tcl_Flush);
      // m.def("Tcl_FreeResult", Tcl_FreeResult);
      // m.def("Tcl_GetAlias", Tcl_GetAlias);
      // m.def("Tcl_GetAliasObj", Tcl_GetAliasObj);
      // m.def("Tcl_GetAssocData", Tcl_GetAssocData);
      // m.def("Tcl_GetChannel", Tcl_GetChannel);
      // m.def("Tcl_GetChannelBufferSize", Tcl_GetChannelBufferSize);
      // m.def("Tcl_GetChannelHandle", Tcl_GetChannelHandle);
      // m.def("Tcl_GetChannelInstanceData", Tcl_GetChannelInstanceData);
      // m.def("Tcl_GetChannelMode", Tcl_GetChannelMode);
      // m.def("Tcl_GetChannelName", Tcl_GetChannelName);
      // m.def("Tcl_GetChannelOption", Tcl_GetChannelOption);
      // m.def("Tcl_GetChannelType", Tcl_GetChannelType);
      // m.def("Tcl_GetCommandInfo", Tcl_GetCommandInfo);
      // m.def("Tcl_GetCommandName", Tcl_GetCommandName);
      // m.def("Tcl_GetErrno", Tcl_GetErrno);
      // m.def("Tcl_GetHostName", Tcl_GetHostName);
      // m.def("Tcl_GetInterpPath", Tcl_GetInterpPath);
      // m.def("Tcl_GetMaster", Tcl_GetMaster);
      // m.def("Tcl_GetNameOfExecutable", Tcl_GetNameOfExecutable);
      // m.def("Tcl_GetObjResult", Tcl_GetObjResult);
      // m.def("Tcl_GetOpenFile", Tcl_GetOpenFile);
      // m.def("Tcl_GetPathType", Tcl_GetPathType);
      // m.def("Tcl_Gets", Tcl_Gets);
      // m.def("Tcl_GetsObj", Tcl_GetsObj);
      // m.def("Tcl_GetServiceMode", Tcl_GetServiceMode);
      // m.def("Tcl_GetSlave", Tcl_GetSlave);
      // m.def("Tcl_GetStdChannel", Tcl_GetStdChannel);
      // m.def("Tcl_GetStringResult", Tcl_GetStringResult);
      // m.def("Tcl_GetVar", Tcl_GetVar);
      // m.def("Tcl_GetVar2", Tcl_GetVar2);
      // m.def("Tcl_GlobalEval", Tcl_GlobalEval);
      // m.def("Tcl_GlobalEvalObj", Tcl_GlobalEvalObj);
      // m.def("Tcl_HideCommand", Tcl_HideCommand);
      // m.def("Tcl_Init", Tcl_Init);
      // m.def("Tcl_InitHashTable", Tcl_InitHashTable);
      // m.def("Tcl_InputBlocked", Tcl_InputBlocked);
      // m.def("Tcl_InputBuffered", Tcl_InputBuffered);
      // m.def("Tcl_InterpDeleted", Tcl_InterpDeleted);
      // m.def("Tcl_IsSafe", Tcl_IsSafe);
      // m.def("Tcl_JoinPath", Tcl_JoinPath);
      // m.def("Tcl_LinkVar", Tcl_LinkVar);
      // m.def("Tcl_MakeFileChannel", Tcl_MakeFileChannel);
      // m.def("Tcl_MakeSafe", Tcl_MakeSafe);
      // m.def("Tcl_MakeTcpClientChannel", Tcl_MakeTcpClientChannel);
      // m.def("Tcl_Merge", Tcl_Merge);
      // m.def("Tcl_NextHashEntry", Tcl_NextHashEntry);
      // m.def("Tcl_NotifyChannel", Tcl_NotifyChannel);
      // m.def("Tcl_ObjGetVar2", Tcl_ObjGetVar2);
      // m.def("Tcl_ObjSetVar2", Tcl_ObjSetVar2);
      // m.def("Tcl_OpenCommandChannel", Tcl_OpenCommandChannel);
      // m.def("Tcl_OpenCommandChannel", Tcl_OpenCommandChannel);
      // m.def("Tcl_OpenFileChannel", Tcl_OpenFileChannel);
      // m.def("Tcl_OpenTcpClient", Tcl_OpenTcpClient);
      // m.def("Tcl_OpenTcpServer", Tcl_OpenTcpServer);
      // m.def("Tcl_Preserve", Tcl_Preserve);
      // m.def("Tcl_PrintDouble", Tcl_PrintDouble);
      // m.def("Tcl_PutEnv", Tcl_PutEnv);
      // m.def("Tcl_PosixError", Tcl_PosixError);
      // m.def("Tcl_QueueEvent", Tcl_QueueEvent);
      // m.def("Tcl_Read", Tcl_Read);
      // m.def("Tcl_ReapDetachedProcs", Tcl_ReapDetachedProcs);
      // m.def("Tcl_ReapDetachedProcs", Tcl_ReapDetachedProcs);
      // m.def("Tcl_RecordAndEval", Tcl_RecordAndEval);
      // m.def("Tcl_RecordAndEvalObj", Tcl_RecordAndEvalObj);
      // m.def("Tcl_RegisterChannel", Tcl_RegisterChannel);
      // m.def("Tcl_RegisterObjType", Tcl_RegisterObjType);
      // m.def("Tcl_RegExpCompile", Tcl_RegExpCompile);
      // m.def("Tcl_RegExpExec", Tcl_RegExpExec);
      // m.def("Tcl_RegExpMatch", Tcl_RegExpMatch);
      // m.def("Tcl_RegExpRange", Tcl_RegExpRange);
      // m.def("Tcl_Release", Tcl_Release);
      // m.def("Tcl_ResetResult", Tcl_ResetResult);
      // m.def("Tcl_ScanElement", Tcl_ScanElement);
      // m.def("Tcl_ScanCountedElement", Tcl_ScanCountedElement);
      // m.def("Tcl_Seek", Tcl_Seek);
      // m.def("Tcl_ServiceAll", Tcl_ServiceAll);
      // m.def("Tcl_ServiceEvent", Tcl_ServiceEvent);
      // m.def("Tcl_SetAssocData", Tcl_SetAssocData);
      // m.def("Tcl_SetChannelBufferSize", Tcl_SetChannelBufferSize);
      // m.def("Tcl_SetChannelOption", Tcl_SetChannelOption);
      // m.def("Tcl_SetCommandInfo", Tcl_SetCommandInfo);
      // m.def("Tcl_SetErrno", Tcl_SetErrno);
      // m.def("Tcl_SetErrorCode", Tcl_SetErrorCode);
      // m.def("Tcl_SetMaxBlockTime", Tcl_SetMaxBlockTime);
      // m.def("Tcl_SetPanicProc", Tcl_SetPanicProc);
      // m.def("Tcl_SetRecursionLimit", Tcl_SetRecursionLimit);
      // m.def("Tcl_SetResult", Tcl_SetResult);
      // m.def("Tcl_SetServiceMode", Tcl_SetServiceMode);
      // m.def("Tcl_SetObjErrorCode", Tcl_SetObjErrorCode);
      // m.def("Tcl_SetObjResult", Tcl_SetObjResult);
      // m.def("Tcl_SetStdChannel", Tcl_SetStdChannel);
      // m.def("Tcl_SetVar", Tcl_SetVar);
      // m.def("Tcl_SetVar2", Tcl_SetVar2);
      // m.def("Tcl_SignalId", Tcl_SignalId);
      // m.def("Tcl_SignalMsg", Tcl_SignalMsg);
      // m.def("Tcl_SourceRCFile", Tcl_SourceRCFile);
      // m.def("Tcl_SplitList", Tcl_SplitList);
      // m.def("Tcl_SplitPath", Tcl_SplitPath);
      // m.def("Tcl_StaticPackage", Tcl_StaticPackage);
      // m.def("Tcl_StringMatch", Tcl_StringMatch);
      // m.def("Tcl_Tell", Tcl_Tell);
      // m.def("Tcl_TraceVar", Tcl_TraceVar);
      // m.def("Tcl_TraceVar2", Tcl_TraceVar2);
      // m.def("Tcl_TranslateFileName", Tcl_TranslateFileName);
      // m.def("Tcl_Ungets", Tcl_Ungets);
      // m.def("Tcl_UnlinkVar", Tcl_UnlinkVar);
      // m.def("Tcl_UnregisterChannel", Tcl_UnregisterChannel);
      // m.def("Tcl_UnsetVar", Tcl_UnsetVar);
      // m.def("Tcl_UnsetVar2", Tcl_UnsetVar2);
      // m.def("Tcl_UntraceVar", Tcl_UntraceVar);
      // m.def("Tcl_UntraceVar2", Tcl_UntraceVar2);
      // m.def("Tcl_UpdateLinkedVar", Tcl_UpdateLinkedVar);
      // m.def("Tcl_UpVar", Tcl_UpVar);
      // m.def("Tcl_UpVar2", Tcl_UpVar2);
      // m.def("Tcl_VarEval", Tcl_VarEval);
      // m.def("Tcl_VarTraceInfo", Tcl_VarTraceInfo);
      // m.def("Tcl_VarTraceInfo2", Tcl_VarTraceInfo2);
      // m.def("Tcl_Write", Tcl_Write);
      // m.def("Tcl_WrongNumArgs", Tcl_WrongNumArgs);
      // m.def("Tcl_DumpActiveMemory", Tcl_DumpActiveMemory);
      // m.def("Tcl_ValidateAllMemory", Tcl_ValidateAllMemory);
      // m.def("Tcl_AppendResultVA", Tcl_AppendResultVA);
      // m.def("Tcl_AppendStringsToObjVA", Tcl_AppendStringsToObjVA);
      // m.def("Tcl_HashStats", Tcl_HashStats);
      // m.def("Tcl_ParseVar", Tcl_ParseVar);
      // m.def("Tcl_PkgPresent", Tcl_PkgPresent);
      // m.def("Tcl_PkgPresentEx", Tcl_PkgPresentEx);
      // m.def("Tcl_PkgProvide", Tcl_PkgProvide);
      // m.def("Tcl_PkgRequire", Tcl_PkgRequire);
      // m.def("Tcl_SetErrorCodeVA", Tcl_SetErrorCodeVA);
      // m.def("Tcl_VarEvalVA", Tcl_VarEvalVA);
      // m.def("Tcl_WaitPid", Tcl_WaitPid);
      // m.def("Tcl_PanicVA", Tcl_PanicVA);
      // m.def("Tcl_PanicVA", Tcl_PanicVA);
      // m.def("Tcl_GetVersion", Tcl_GetVersion);
      // m.def("Tcl_InitMemory", Tcl_InitMemory);
      // m.def("Tcl_StackChannel", Tcl_StackChannel);
      // m.def("Tcl_UnstackChannel", Tcl_UnstackChannel);
      // m.def("Tcl_GetStackedChannel", Tcl_GetStackedChannel);
      // m.def("Tcl_AppendObjToObj", Tcl_AppendObjToObj);
      // m.def("Tcl_CreateEncoding", Tcl_CreateEncoding);
      // m.def("Tcl_CreateThreadExitHandler", Tcl_CreateThreadExitHandler);
      // m.def("Tcl_DeleteThreadExitHandler", Tcl_DeleteThreadExitHandler);
      // m.def("Tcl_DiscardResult", Tcl_DiscardResult);
      // m.def("Tcl_EvalEx", Tcl_EvalEx);
      // m.def("Tcl_EvalObjv", Tcl_EvalObjv);
      // m.def("Tcl_EvalObjEx", Tcl_EvalObjEx);
      // m.def("Tcl_ExitThread", Tcl_ExitThread);
      // m.def("Tcl_ExternalToUtf", Tcl_ExternalToUtf);
      // m.def("Tcl_ExternalToUtfDString", Tcl_ExternalToUtfDString);
      // m.def("Tcl_FinalizeThread", Tcl_FinalizeThread);
      // m.def("Tcl_FinalizeNotifier", Tcl_FinalizeNotifier);
      // m.def("Tcl_FreeEncoding", Tcl_FreeEncoding);
      // m.def("Tcl_GetCurrentThread", Tcl_GetCurrentThread);
      // m.def("Tcl_GetEncoding", Tcl_GetEncoding);
      // m.def("Tcl_GetEncodingName", Tcl_GetEncodingName);
      // m.def("Tcl_GetEncodingNames", Tcl_GetEncodingNames);
      // m.def("Tcl_GetIndexFromObjStruct", Tcl_GetIndexFromObjStruct);
      // m.def("Tcl_GetThreadData", Tcl_GetThreadData);
      // m.def("Tcl_GetVar2Ex", Tcl_GetVar2Ex);
      // m.def("Tcl_InitNotifier", Tcl_InitNotifier);
      // m.def("Tcl_MutexLock", Tcl_MutexLock);
      // m.def("Tcl_MutexUnlock", Tcl_MutexUnlock);
      // m.def("Tcl_ConditionNotify", Tcl_ConditionNotify);
      // m.def("Tcl_ConditionWait", Tcl_ConditionWait);
      // m.def("Tcl_NumUtfChars", Tcl_NumUtfChars);
      // m.def("Tcl_ReadChars", Tcl_ReadChars);
      // m.def("Tcl_RestoreResult", Tcl_RestoreResult);
      // m.def("Tcl_SaveResult", Tcl_SaveResult);
      // m.def("Tcl_SetSystemEncoding", Tcl_SetSystemEncoding);
      // m.def("Tcl_SetVar2Ex", Tcl_SetVar2Ex);
      // m.def("Tcl_ThreadAlert", Tcl_ThreadAlert);
      // m.def("Tcl_ThreadQueueEvent", Tcl_ThreadQueueEvent);
      // m.def("Tcl_UniCharAtIndex", Tcl_UniCharAtIndex);
      // m.def("Tcl_UniCharToLower", Tcl_UniCharToLower);
      // m.def("Tcl_UniCharToTitle", Tcl_UniCharToTitle);
      // m.def("Tcl_UniCharToUpper", Tcl_UniCharToUpper);
      // m.def("Tcl_UniCharToUtf", Tcl_UniCharToUtf);
      // m.def("Tcl_UtfAtIndex", Tcl_UtfAtIndex);
      // m.def("Tcl_UtfCharComplete", Tcl_UtfCharComplete);
      // m.def("Tcl_UtfBackslash", Tcl_UtfBackslash);
      // m.def("Tcl_UtfFindFirst", Tcl_UtfFindFirst);
      // m.def("Tcl_UtfFindLast", Tcl_UtfFindLast);
      // m.def("Tcl_UtfNext", Tcl_UtfNext);
      // m.def("Tcl_UtfPrev", Tcl_UtfPrev);
      // m.def("Tcl_UtfToExternal", Tcl_UtfToExternal);
      // m.def("Tcl_UtfToExternalDString", Tcl_UtfToExternalDString);
      // m.def("Tcl_UtfToLower", Tcl_UtfToLower);
      // m.def("Tcl_UtfToTitle", Tcl_UtfToTitle);
      // m.def("Tcl_UtfToUniChar", Tcl_UtfToUniChar);
      // m.def("Tcl_UtfToUpper", Tcl_UtfToUpper);
      // m.def("Tcl_WriteChars", Tcl_WriteChars);
      // m.def("Tcl_WriteObj", Tcl_WriteObj);
      // m.def("Tcl_GetString", Tcl_GetString);
      // m.def("Tcl_GetDefaultEncodingDir", Tcl_GetDefaultEncodingDir);
      // m.def("Tcl_SetDefaultEncodingDir", Tcl_SetDefaultEncodingDir);
      // m.def("Tcl_AlertNotifier", Tcl_AlertNotifier);
      // m.def("Tcl_ServiceModeHook", Tcl_ServiceModeHook);
      // m.def("Tcl_UniCharIsAlnum", Tcl_UniCharIsAlnum);
      // m.def("Tcl_UniCharIsAlpha", Tcl_UniCharIsAlpha);
      // m.def("Tcl_UniCharIsDigit", Tcl_UniCharIsDigit);
      // m.def("Tcl_UniCharIsLower", Tcl_UniCharIsLower);
      // m.def("Tcl_UniCharIsSpace", Tcl_UniCharIsSpace);
      // m.def("Tcl_UniCharIsUpper", Tcl_UniCharIsUpper);
      // m.def("Tcl_UniCharIsWordChar", Tcl_UniCharIsWordChar);
      // m.def("Tcl_UniCharLen", Tcl_UniCharLen);
      // m.def("Tcl_UniCharNcmp", Tcl_UniCharNcmp);
      // m.def("Tcl_UniCharToUtfDString", Tcl_UniCharToUtfDString);
      // m.def("Tcl_UtfToUniCharDString", Tcl_UtfToUniCharDString);
      // m.def("Tcl_GetRegExpFromObj", Tcl_GetRegExpFromObj);
      // m.def("Tcl_EvalTokens", Tcl_EvalTokens);
      // m.def("Tcl_FreeParse", Tcl_FreeParse);
      // m.def("Tcl_LogCommandInfo", Tcl_LogCommandInfo);
      // m.def("Tcl_ParseBraces", Tcl_ParseBraces);
      // m.def("Tcl_ParseCommand", Tcl_ParseCommand);
      // m.def("Tcl_ParseExpr", Tcl_ParseExpr);
      // m.def("Tcl_ParseQuotedString", Tcl_ParseQuotedString);
      // m.def("Tcl_ParseVarName", Tcl_ParseVarName);
      // m.def("Tcl_GetCwd", Tcl_GetCwd);
      // m.def("Tcl_Chdir", Tcl_Chdir);
      // m.def("Tcl_Access", Tcl_Access);
      // m.def("Tcl_Stat", Tcl_Stat);
      // m.def("Tcl_UtfNcmp", Tcl_UtfNcmp);
      // m.def("Tcl_UtfNcasecmp", Tcl_UtfNcasecmp);
      // m.def("Tcl_StringCaseMatch", Tcl_StringCaseMatch);
      // m.def("Tcl_UniCharIsControl", Tcl_UniCharIsControl);
      // m.def("Tcl_UniCharIsGraph", Tcl_UniCharIsGraph);
      // m.def("Tcl_UniCharIsPrint", Tcl_UniCharIsPrint);
      // m.def("Tcl_UniCharIsPunct", Tcl_UniCharIsPunct);
      // m.def("Tcl_RegExpExecObj", Tcl_RegExpExecObj);
      // m.def("Tcl_RegExpGetInfo", Tcl_RegExpGetInfo);
      // m.def("Tcl_NewUnicodeObj", Tcl_NewUnicodeObj);
      // m.def("Tcl_SetUnicodeObj", Tcl_SetUnicodeObj);
      // m.def("Tcl_GetCharLength", Tcl_GetCharLength);
      // m.def("Tcl_GetUniChar", Tcl_GetUniChar);
      // m.def("Tcl_GetUnicode", Tcl_GetUnicode);
      // m.def("Tcl_GetRange", Tcl_GetRange);
      // m.def("Tcl_AppendUnicodeToObj", Tcl_AppendUnicodeToObj);
      // m.def("Tcl_RegExpMatchObj", Tcl_RegExpMatchObj);
      // m.def("Tcl_SetNotifier", Tcl_SetNotifier);
      // m.def("Tcl_GetAllocMutex", Tcl_GetAllocMutex);
      // m.def("Tcl_GetChannelNames", Tcl_GetChannelNames);
      // m.def("Tcl_GetChannelNamesEx", Tcl_GetChannelNamesEx);
      // m.def("Tcl_ProcObjCmd", Tcl_ProcObjCmd);
      // m.def("Tcl_ConditionFinalize", Tcl_ConditionFinalize);
      // m.def("Tcl_MutexFinalize", Tcl_MutexFinalize);
      // m.def("Tcl_CreateThread", Tcl_CreateThread);
      // m.def("Tcl_ReadRaw", Tcl_ReadRaw);
      // m.def("Tcl_WriteRaw", Tcl_WriteRaw);
      // m.def("Tcl_GetTopChannel", Tcl_GetTopChannel);
      // m.def("Tcl_ChannelBuffered", Tcl_ChannelBuffered);
      // m.def("Tcl_ChannelName", Tcl_ChannelName);
      // m.def("Tcl_ChannelVersion", Tcl_ChannelVersion);
      // m.def("Tcl_ChannelBlockModeProc", Tcl_ChannelBlockModeProc);
      // m.def("Tcl_ChannelCloseProc", Tcl_ChannelCloseProc);
      // m.def("Tcl_ChannelClose2Proc", Tcl_ChannelClose2Proc);
      // m.def("Tcl_ChannelInputProc", Tcl_ChannelInputProc);
      // m.def("Tcl_ChannelOutputProc", Tcl_ChannelOutputProc);
      // m.def("Tcl_ChannelSeekProc", Tcl_ChannelSeekProc);
      // m.def("Tcl_ChannelSetOptionProc", Tcl_ChannelSetOptionProc);
      // m.def("Tcl_ChannelGetOptionProc", Tcl_ChannelGetOptionProc);
      // m.def("Tcl_ChannelWatchProc", Tcl_ChannelWatchProc);
      // m.def("Tcl_ChannelGetHandleProc", Tcl_ChannelGetHandleProc);
      // m.def("Tcl_ChannelFlushProc", Tcl_ChannelFlushProc);
      // m.def("Tcl_ChannelHandlerProc", Tcl_ChannelHandlerProc);
  }
  