## Tcl9.0.3/Tk9.0.3 Documentation > Tcl C API > Tcl_Main

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    Tcl_Main, Tcl_MainEx, Tcl_MainExW, Tcl_SetStartupScript, Tcl_GetStartupScript, Tcl_SetMainLoop — Tcl-志向応用譜の為の主算譜､立上げ記述譜､行事待ち巡回を定義する main program, startup script, and event loop definition for Tcl-based applications
  SYNOPSIS
    #include <tcl.h>
    Tcl_Main(argc, argv, appInitProc)
    Tcl_MainEx(argc, charargv, appInitProc, interp)
    Tcl_MainExW(argc, wideargv, appInitProc, interp)
    Tcl_SetStartupScript(path, encoding)
    Tcl_Obj *
    Tcl_GetStartupScript(encodingPtr)
    Tcl_SetMainLoop(mainLoopProc)
  引数 ARGUMENTS
    Tcl_Size argc (入力in)
    char *argv[] (入力in)
    char *charargv[] (入力in)
    char *wideargv[] (入力in)
    Tcl_AppInitProc *appInitProc (入力in)
    Tcl_Obj *path (入力in)
    const char *encoding (入力in)
    const char **encodingPtr (out)
    Tcl_MainLoopProc *mainLoopProc (入力in)
    Tcl_Interp *interp (入力in)
  説明 DESCRIPTION
  参照回数管理 REFERENCE COUNT MANAGEMENT
  SEE ALSO
  KEYWORDS

### NAME

Tcl_Main, Tcl_MainEx, Tcl_MainExW, Tcl_SetStartupScript, Tcl_GetStartupScript, Tcl_SetMainLoop — Tcl-志向応用譜の為の主算譜､立上げ記述譜､行事待ち巡回を定義する main program, startup script, and event loop definition for Tcl-based applications

### SYNOPSIS

#include <tcl.h>
Tcl_Main(argc, argv, appInitProc)
Tcl_MainEx(argc, charargv, appInitProc, interp)
Tcl_MainExW(argc, wideargv, appInitProc, interp)
Tcl_SetStartupScript(path, encoding)
Tcl_Obj *
Tcl_GetStartupScript(encodingPtr)
Tcl_SetMainLoop(mainLoopProc)

### 引数 ARGUMENTS

Tcl_Size argc (入力in)
  argv内の要素の数｡ Number of elements in argv.

char *argv[] (入力in)
  命令行引数を含む文字列の配列｡Windows 上で -DUNICODE を使う場合､その假引数の型は wchar_t * に変る｡ Array of strings containing command-line arguments. On Windows, when using -DUNICODE, the parameter type changes to wchar_t *.

char *charargv[] (入力in)
  argv として､但し型は wchar_t に変更しない｡ As argv, but does not change type to wchar_t.

char *wideargv[] (入力in)
  argv として､但し型は常に wchar_t ｡ As argv, but type is always wchar_t.

Tcl_AppInitProc *appInitProc (入力in)
  応用譜固有の初期化手続函数の番地｡この引数の値は通常 Tcl_AppInit である｡ Address of an application-specific initialization procedure. The value for this argument is usually Tcl_AppInit.

Tcl_Obj *path (入力in)
  立上げ記述譜として使用されるファイルの名前､又は NULL｡　 Name of file to use as startup script, or NULL.

const char *encoding (入力in)
  立上げ記述譜として使用されるファイルの符号化系､又は NULL｡ Encoding of file to use as startup script, or NULL.

const char **encodingPtr (out)
  もし非-NULL なら､符号化の名前を指している (const char *) の複写を書く場所｡ If non-NULL, location to write a copy of the (const char *) pointing to the encoding name.

Tcl_MainLoopProc *mainLoopProc (入力in)
  応用譜固有の行事巡回手続函数の番地｡ Address of an application-specific event loop procedure.

Tcl_Interp *interp (入力in)
  既に生成された Tcl 解釈実行機能｡ Already created Tcl Interpreter.

### 説明 DESCRIPTION

Tcl_Main は Tcl-基本の対話処理型の応用譜の為の主算譜として働きうる｡ “対話処理型の応用譜” は tclsh や wish に似た算譜であり､ Tcl の対話型解釈実行と､ファイル内に含まれる記述譜の実行を､黒窓内命令行の如くに評価すること､の両方を運営している｡Tcl_Main は対話処理の開発者への便益として提供されているので､ Tcl 外部函数群の適切な初期化の為の命令譜や､対話的処理操作の全てを再生産する訳ではない｡応用譜内への Tcl 組込みの様式も Tcl_Main は運営できない｡それらは Tcl 外部函数群の下位の水準の函数を直接呼出して達成しなければならない｡ Tcl_Main can serve as the main program for Tcl-based shell applications. A “shell application” is a program like tclsh or wish that supports both interactive interpretation of Tcl and evaluation of a script contained in a file given as a command line argument. Tcl_Main is offered as a convenience to developers of shell applications, so they do not have to reproduce all of the code for proper initialization of the Tcl library and interactive shell operation. Other styles of embedding Tcl in an application are not supported by Tcl_Main. Those must be achieved by calling lower level functions in the Tcl library directly.

Tcl_Main 函数はTcl 7.4 以降にTcl 外部函数内で提供された｡古い版のTcl では､Tcl 外部函数そのものが main 函数として定義されていたが､それでは組込み型の柔軟性が欠如していたし､外部函数群内(特に共有外部函数群)に main 函数を有することは多くの系で厄介を生じる｡又 main をTcl 外部函数群内に有することは C++ 算譜内でのTcl の使用を難しくする､理由は､ C++ 算譜は特別の C++ main 函数を有さねばならないから｡ The Tcl_Main function has been offered by the Tcl library since release Tcl 7.4. In older releases of Tcl, the Tcl library itself defined a function main, but that lacks flexibility of embedding style and having a function main in a library (particularly a shared library) causes problems on many systems. Having main in the Tcl library would also make it hard to use Tcl in C++ programs, since C++ programs must have special C++ main functions.

通常それぞれの対話型応用譜では､Tcl_Main を起動する以外は何もしない小さな main 函数を含む｡Tcl_Main は tclsh-様の応用譜の全ての作成と実行の働きをする｡ Normally each shell application contains a small main function that does nothing but invoke Tcl_Main. Tcl_Main then does all the work of creating and running a tclsh-like application.

Tcl_Main は Tcl の stub 外部函数による共通の接続機能によって提供はされていない｡ Tcl_Main を呼出す算譜は標準Tcl 外部函数に対して連結をしなければならない｡ もし､標準外部函数が dll の場合(即ち､静的 .lib/.a ではない)､算譜はスタブ外部函数とも同じく連結されねばならない｡ 拡張機能(stub-機能の有無を問ず)は Tcl_Main の呼出しを意図していない｡ Tcl_Main is not provided by the public interface of Tcl's stub library. Programs that call Tcl_Main must be linked against the standard Tcl library. If the standard Tcl library is a dll (so, not a static .lib/.a) , then the program must be linked against the stub library as well. Extensions (stub-enabled or not) are not intended to call Tcl_Main.

Tcl_Main は安全な時分割系ではない｡多重時分割応用譜の一つの時分割片の親から単に呼ばれるべきである｡この制限は上記の通常の使用では不都合はない｡ Tcl_Main is not thread-safe. It should only be called by a single main thread of a multi-threaded application. This restriction is not a problem with normal use described above.

Tcl_Main とそれに基く全ての応用譜は､ tclsh の様に標準通信路をその無為設定値に初期化する為に Tcl_GetStdChannel を使う｡更なる情報は Tcl_StandardChannels を参照されたい｡ Tcl_Main and therefore all applications based upon it, like tclsh, use Tcl_GetStdChannel to initialize the standard channels to their default values. See Tcl_StandardChannels for more information.

Tcl_Main は､ファイル名と開始記述譜の符号系が確立されているか否か基いて二つの操作の様式を運営する｡機能譜 Tcl_SetStartupScript と Tcl_GetStartupScript は Tcl_Main の構成設定の制御の為の道具類である｡ Tcl_Main supports two modes of operation, depending on whether the filename and encoding of a startup script has been established. The routines Tcl_SetStartupScript and Tcl_GetStartupScript are the tools for controlling this configuration of Tcl_Main.

Tcl_SetStartupScript は､値 path を､その初期化記述譜として評価する為に Tcl_Main の為のファイルの名前として登録する｡値 encoding はそのファイル内に文章を保存する為に使われる符号系についての Tcl's の名称である｡ encoding に関する値 NULL は系の符号系を使う信号である｡ path に関する値 NULL は既存のどの登録も抹消するので､ Tcl_Main はいかなる開始記述譜も評価する事はない｡ Tcl_SetStartupScript registers the value path as the name of the file for Tcl_Main to evaluate as its startup script. The value encoding is Tcl's name for the encoding used to store the text in that file. A value of NULL for encoding is a signal to use the system encoding. A value of NULL for path erases any existing registration so that Tcl_Main will not evaluate any startup script.

Tcl_GetStartupScript は､同じ時分割片内で最も最近呼ばれた Tcl_SetStartupScript によって登録されたファイル名と符号系を聞き出す｡保存されたファイル名が返され､保存された符号系名は encodingPtr が NULL でなければ､それによって指し示された領域に記入される｡ Tcl_GetStartupScript queries the registered file name and encoding set by the most recent Tcl_SetStartupScript call in the same thread. The stored file name is returned, and the stored encoding name is written to space pointed to by encodingPtr, when that is not NULL.

機能譜 Tcl_SetStartupScript と Tcl_GetStartupScript に管理されるファイル名と符号系値は時分割毎に保存される｡これ等の機能譜の記憶域と取出し機能はどの時分割片内で働くにも拘わらず､同じ親の時分割内の Tcl_Main からの呼出しのみがそれに影響を有する｡ The file name and encoding values managed by the routines Tcl_SetStartupScript and Tcl_GetStartupScript are stored per-thread. Although the storage and retrieval functions of these routines work in any thread, only those calls in the same main thread as Tcl_Main can have any influence on it.

Tcl_Main の呼出し側はその望ましい開始記述譜を確立する為に Tcl_SetStartupScript を最初に呼ぶ｡ Tcl_Main は､もしこのような開始記述譜が確立されていないことが判ると､ argv 内の最初の幾つかの引数を調べる｡もしそれが ?-encoding name? fileName に合致し､但し fileName は文字 - では始まらない場合､ fileName は初期化記述譜を含むファイルとして取扱われ､ name はファイルの内容の符号系の名前であると看做される｡ Tcl_Main はこれ等の値を伴って Tcl_SetStartupScript を呼ぶ｡ The caller of Tcl_Main may call Tcl_SetStartupScript first to establish its desired startup script. If Tcl_Main finds that no such startup script has been established, it consults the first few arguments in argv. If they match ?-encoding name? fileName, where fileName does not begin with the character -, then fileName is taken to be the name of a file containing a startup script, and name is taken to be the name of the encoding of the contents of that file. Tcl_Main then calls Tcl_SetStartupScript with these values.

Tcl_Main はその親の解釈実行機能内で Tcl 変数 argc と argv と argv0 と tcl_interactive を tclsh の為に説明書内で記述されたとして､定義する｡ Tcl_Main then defines in its main interpreter the Tcl variables argc, argv, argv0, and tcl_interactive, as described in the documentation for tclsh.

自身の初期化が完了したが､命令を未だ処理する前に､ Tcl_Main は appInitProc 引数に与えられた手続函数を呼ぶ｡この手続函数は､Tcl_Main によって作成された解釈実行機能の自己の初期化のための応用譜に関する “接続” ､譬えば応用譜固有の命令を定義すること､を提供する｡その応用譜の初期化譜は､初期化記述譜として使われるファイルと符号系を(再)設定する為に､ Tcl_SetStartupScript を呼ぶかもしれない｡この手続函数は Tcl_AppInitProc 型に合致する相互接続機能を有さねばならない: When it has finished its own initialization, but before it processes commands, Tcl_Main calls the procedure given by the appInitProc argument. This procedure provides a “hook” for the application to perform its own initialization of the interpreter created by Tcl_Main, such as defining application-specific commands. The application initialization routine might also call Tcl_SetStartupScript to (re-)set the file and encoding to be used as a startup script. The procedure must have an interface that matches the type Tcl_AppInitProc:

    typedef int Tcl_AppInitProc(
            Tcl_Interp *interp);

AppInitProc は殆ど常に Tcl_AppInit へのポインターである; この手続函数に拘わる更なる詳細は説明書の Tcl_AppInit を参照されたい｡ AppInitProc is almost always a pointer to Tcl_AppInit; for more details on this procedure, see the documentation for Tcl_AppInit.

appInitProc が終了したとき､Tcl_Main は､開始記述譜があれば､どの開始記述譜が要求されているかを決定する為に Tcl_GetStartupScript を呼ぶ｡もし､開始記述譜が提供されている場合､Tcl_Main はそれを評価しようと試みる｡それ以外の場合､親の解釈実行効能内の変数 tcl_rcFileName の検査を伴い対話様式が開始する｡もしその変数が実在し､読込み可能なファイルの名前を保有している場合は､其のファイルの内容が親の解釈実行機能内で評価される｡次に､対話操作が開始され､入力促進符号と命令評価の結果が標準出力通信路に書込まれ､標準入力内の命令が読込まれ評価される｡標準出力通信路に書かれた促進符号は tclsh の為の説明書内に記載された如くTcl 変数 tcl_prompt1 と tcl_prompt2 を定義することにより註文通りに直す事ができる｡促進符号と評価結果は､親の解釈実行機能内の Tcl 変数 tcl_interactive が非零整数を保有する場合にのみ､標準出力通信路に記入される｡ When the appInitProc is finished, Tcl_Main calls Tcl_GetStartupScript to determine what startup script has been requested, if any. If a startup script has been provided, Tcl_Main attempts to evaluate it. Otherwise, interactive mode begins with examination of the variable tcl_rcFileName in the main interpreter. If that variable exists and holds the name of a readable file, the contents of that file are evaluated in the main interpreter. Then interactive operations begin, with prompts and command evaluation results written to the standard output channel, and commands read from the standard input channel and then evaluated. The prompts written to the standard output channel may be customized by defining the Tcl variables tcl_prompt1 and tcl_prompt2 as described in the documentation for tclsh. The prompts and command evaluation results are written to the standard output channel only if the Tcl variable tcl_interactive in the main interpreter holds a non-zero integer value.

Tcl_SetMainLoop は､行事待機の手続函数の設定と実行を許容する｡この許容は､譬えば､Tk に其の行事巡回の積込みと設定を動的にさせる｡行事巡回は開始記述譜に続いて実行される｡今対話様式になっていると､主巡回手続函数の設定は入力促進印をファイル行事に基づいたものにし､巡回手続函数を呼ぶ｡巡回手続函数が対話様式内に返ったとき､対話操作が続くことになる｡主巡回手続函数は Tcl_MainLoopProc の型に合致する相互干渉機能を有しなければならない: Tcl_SetMainLoop allows setting an event loop procedure to be run. This allows, for example, Tk to be dynamically loaded and set its event loop. The event loop will run following the startup script. If you are in interactive mode, setting the main loop procedure will cause the prompt to become fileevent based and then the loop procedure is called. When the loop procedure returns in interactive mode, interactive operation will continue. The main loop procedure must have an interface that matches the type Tcl_MainLoopProc:

    typedef void Tcl_MainLoopProc(void);

Tcl_Main は､制御を返さない｡通常､Tcl_Main に基く算譜は exit 命令が評価された時に終了する｡対話様式では､標準入力通信路でファイル末尾信号か通信路不具合に遭遇した場合､主巡回手続函数(ある場合には)から返った後､Tcl_Main 自身が exit 命令を評価する｡非会話様式内では､ Tcl_Main が開始記述譜を評価した後､主巡回手続函数(ある場合には)から返った後､Tcl_Main がやはり exit 命令を評価する｡ Tcl_Main does not return. Normally a program based on Tcl_Main will terminate when the exit command is evaluated. In interactive mode, if an EOF or channel error is encountered on the standard input channel, then Tcl_Main itself will evaluate the exit command after the main loop procedure (if any) returns. In non-interactive mode, after Tcl_Main evaluates the startup script, and the main loop procedure (if any) returns, Tcl_Main will also evaluate the exit command.

Tcl_Mainはstub-可能な拡張に使うことはできない｡ Tcl_Main can not be used in stub-enabled extensions.

Tcl_MainEx と Tcl_MainExWの違いは､引数が文字で渡されるか､多バイト文字で渡されるかである｡ スタブ可能な埋込譜内で使われる時､スタブ表は Tcl_InitSubsystemsかTcl_SetPanicProcかTcl_FindExecutableかTclZipfs_AppHook の内の一つを使って､初期化されねばならない｡ The difference between Tcl_MainEx and Tcl_MainExW is that the arguments are passed as characters or wide characters. When used in stub-enabled embedders, the stubs table must be first initialized using one of Tcl_InitSubsystems, Tcl_SetPanicProc, Tcl_FindExecutable or TclZipfs_AppHook.

### 参照回数管理 REFERENCE COUNT MANAGEMENT

Tcl_SetStartupScriptはそのpath引数の為に､値(又はヌル)を採る､且つ､その参照回数を増加する｡ Tcl_SetStartupScript takes a value (or NULL) for its path argument, and will increment the reference count of it.

Tcl_GetStartupScriptは､参照回数に関する値を､少なくとも1かヌルを返す｡ 両方の場合､値の所有者は現在の時分割実行細片である｡ Tcl_GetStartupScript returns a value with reference count at least 1, or NULL. It's encodingPtr is also used (if non-NULL) to return a value with a reference count at least 1, or NULL. In both cases, the owner of the values is the current thread.

### SEE ALSO

tclsh, Tcl_GetStdChannel, Tcl_StandardChannels, Tcl_AppInit, exit, encoding

### KEYWORDS

application-specific initialization, command-line arguments, main program
Copyright © 1994 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.
Copyright © 2000 Ajuba Solutions.