Universal ctagsの内部紹介¶
主要なデータ型¶
parserDefinition
定義箇所
main/parse.h役割
入力言語別に存在するパーザを表現するデータ構造です。フィールド
name
パーザの名前、–list-languagesの出力に使われます。parserあるいはparser2
実際にパースする関数へのポインタを保持します。2つのうちNULLで無い方が使われます。initialize
このパーザが始めつ使われるとき、このフィールドがNULLで無ければ、このフィールドが指す関数が呼び出されます。パーザに何らかの初期化が必要な場合に使います。extensions
このパーザが担当できるファイルの拡張子が列挙された文字列の配列を指し示します。–list-mapsの出力にも使われます。kinds
kindOption型 はkindを表現します。このフィールドは、パーザが扱うkindに対するkindOptionが列挙された配列を指し示します。kindCount
kinds配列の要素数を示します。
tagEntryInfo
定義箇所
main/parse.h役割
tagsファイル中の各要素(行)を表現します。パーザはこのデータ構造を作って、makeSimpleTag あるいは makeTagEntryを呼び出します。すると出力されます。フィールド
name
ソースコード上に定義された「何か」の名前です。sourceFileName
nameが定義されたソースコードファイルの名前です。lineNumber
nameが定義されたソースコードファイル中の行番号です。kind
「何か」の種類を示すkindOption型のデータを指します。extensionFields
各種 field に対するデータを保持する構造体が埋め込まれています。課題に関連するsignatureもここに記録されます。
主要な関数 と マクロ¶
createTagsForFile
定義箇所
main/parse.c役割
パーザが使います。仕掛けの側にあって、入力ファイル毎にバックエンド(のparserあるいはparser2フィールドが指し示す関数)を呼び出します。
fileGetc
定義箇所
main/read.c役割
パーザが使います。パーザには行単位で入力を扱いパースするものと、文字単位で入力を扱いパースするものがあります。
呼び出されるたびに現在の入力ファイルから1文字を返します。
fileReadLine
定義箇所
main/read.c役割
パーザが使います。呼び出されるたびに現在の入力ファイルから1行を返します。
initTagEntry/initTagEntryFull
定義箇所
main/entry.c役割
パーザが使います。引数として渡したtagEntryInfo構造体の変数を初期化します。
makeTagEntry
定義箇所
main/entry.c役割
パーザが使います。引数として渡したtagEntryInfo構造体の変数を書き出すよう、「仕掛け」の側に依頼します。
makeSimpleTag
定義箇所
main/parse.c役割
initTagEntryの処理とmakeTagEntryの処理をまとめて実行します。
main関数の場所¶
ctags-github/main/main.cの末尾
main関数の内容¶
extern int main (int __unused__ argc, char **argv)
{
cookedArgs *args;
setCurrentDirectory ();
setExecutableName (*argv++);
sanitizeEnviron ();
checkRegex ();
args = cArgNewFromArgv (argv);
previewFirstOption (args);
testEtagsInvocation ();
initializeParsing ();
initOptions ();
readOptionConfiguration ();
verbose ("Reading initial options from command line\n");
parseCmdlineOptions (args);
checkOptions ();
unifyLanguageMaps ();
makeTags (args);
/* Clean up.
*/
cArgDelete (args);
freeKeywordTable ();
freeRoutineResources ();
freeSourceFileResources ();
freeTagFileResources ();
freeOptionResources ();
freeParserResources ();
freeRegexResources ();
freeXcmdResources ();
#ifdef HAVE_ICONV
freeEncodingResources ();
#endif
if (Option.printLanguage)
return (Option.printLanguage == TRUE)? 0: 1;
exit (0);
return 0;
}
args = cArgNewFromArgv (argv);
OSから渡されてきたコマンドライン引数char **argvを、自前で持っているオプション引数解析ルーチンに渡して、自分に都合の良いcookedArgs型へ変換しています。
previewFirstOption (args);
引数として渡されたオプションのうち優先して解釈する必要のあるものを解釈、処理しています。
initializeParsing ()
入力言語別に存在するパーザを LanguageTable という配列に登録します。各パーザを識別する整数値パーザが自身を登録するための関数があり、それらは parsers.h にPARSER_LISTマクロとして列挙されています。
parseCmdlineOptions ()
引数として渡されたオプション を解釈、処理します。
makeTags (args);
ctagsの中枢となる関数で。argsに残された入力ファイルの一覧を引数にとり、引数一つ一つに対して、引数が指し示すファイルを処理するのに適当なパーザを選択し、パーザを呼び出します。