# funcman/include/funcman.h

# 1 ファイル

## 1.1 funcman/include/funcman.h

関数動的呼び出し機構 (funcman) の公開 API ヘッダー。

funcman は、テキスト設定ファイルから関数シンボルとライブラリ名を読み込み、 実行時に動的リンクで関数を解決するキャッシュ機構です。

使用方法:

1. funcman_object を NEW_FUNCMAN_OBJECT マクロで静的初期化する。
2. funcman_init() でテキスト設定ファイルを読み込む (DllMain/constructor から呼ぶ)。
3. funcman_get_func() で関数ポインタを取得して呼び出す。
4. funcman_dispose() でリソースを解放する (DllMain/destructor から呼ぶ)。

### 1.1.1 作者

c-modenization-kit sample team

### 1.1.2 バージョン

1.0.0

### 1.1.3 日付

2026/03/17

### 1.1.4 著作権

Copyright (C) CompanyName, Ltd. 2026. All rights reserved.

# 2 関数

## 2.1 _funcman_get_func

    void *_funcman_get_func ( funcman_object *fobj )

拡張関数ポインタを返します。この関数は内部用です。

既にロード済みの場合は即座に格納済みの関数ポインタを返します。

### 2.1.1 引数

- fobj [in,out] funcman_object へのポインタ。

### 2.1.2 戻り値

成功時 void * (関数ポインタ)、失敗時 NULL。

## 2.2 funcman_is_declared_default

    int funcman_is_declared_default ( funcman_object *fobj )

funcman_object が明示的デフォルトかどうかを返します。

lib_name と func_name がともに定義ファイルで default に設定されている場合に 1 を返します。
それ以外の場合は 0 を返します。

### 2.2.1 引数

- fobj [in] funcman_object へのポインタ。

### 2.2.2 戻り値

明示的デフォルトの場合は 1、それ以外は 0。

## 2.3 funcman_init

    void funcman_init ( funcman_object *const *fobj_array, const size_t fobj_length, const char *configpath )

funcman_object ポインタ配列を初期化します。

必ず、constructor / DllMain コンテキストから呼ぶようにしてください。

### 2.3.1 引数

- fobj_array [in] funcman_object ポインタ配列。
- fobj_length [in] 配列の要素数。
- configpath [in] 定義ファイルのパス。

## 2.4 funcman_dispose

    void funcman_dispose ( funcman_object *const *fobj_array, const size_t fobj_length )

funcman_object ポインタ配列を解放します。

必ず、destructor / DllMain コンテキストから呼ぶようにしてください。

### 2.4.1 引数

- fobj_array [in] funcman_object ポインタ配列。
- fobj_length [in] 配列の要素数。

## 2.5 funcman_info

    int funcman_info ( funcman_object *const *fobj_array, const size_t fobj_length )

funcman_object ポインタ配列の内容を標準出力に表示します。

### 2.5.1 引数

- fobj_array [in] funcman_object ポインタ配列。
- fobj_length [in] 配列の要素数。

### 2.5.2 戻り値

すべてのエントリが正常に解決されている場合は 0、1 つでも失敗している場合は -1 を返します。

## 2.6 get_lib_path

    int get_lib_path ( char *out_path, const size_t out_path_sz, const void *func_addr )

指定した関数が所属する共有ライブラリ (.so/.dll) の絶対パスを取得します。

### 2.6.1 引数

- out_path [out] 出力バッファ。
- out_path_sz [in] 出力バッファサイズ[byte]。
- func_addr [in] 所属モジュールを特定するための関数アドレス。

### 2.6.2 戻り値

関数が成功した場合、0 を返します。失敗した場合は 0 以外を返します。

## 2.7 get_lib_basename

    int get_lib_basename ( char *out_basename, const size_t out_basename_sz, const void *func_addr )

指定した関数が所属する共有ライブラリ (.so/.dll) の basename (パスなし・拡張子なし) を取得します。

Linux の .so.1.2.3 のようなバージョン付きは “.so.” より前を basename とみなします。

### 2.7.1 引数

- out_basename [out] 出力バッファ。
- out_basename_sz [in] 出力バッファサイズ[byte]。
- func_addr [in] 所属モジュールを特定するための関数アドレス。

### 2.7.2 戻り値

関数が成功した場合、0 を返します。失敗した場合は 0 以外を返します。

# 3 定数、マクロ

## 3.1 _GNU_SOURCE

    #define _GNU_SOURCE

## 3.2 MODULE_HANDLE

    #define MODULE_HANDLE void *

Linux/Windows 共通のモジュールハンドル型。

## 3.3 FUNCMAN_NAME_MAX

    #define FUNCMAN_NAME_MAX 256

lib_name / func_name 配列の最大長 (終端 ‘\0’ を含む)。

## 3.4 NEW_FUNCMAN_OBJECT

    #define NEW_FUNCMAN_OBJECT ( key, type )
        {(key), {0}, {0}, NULL, NULL, 0, 0, PTHREAD_MUTEX_INITIALIZER}

funcman_object 静的変数の初期化マクロ。

### 3.4.1 引数

- key [in] この関数インスタンスの識別キー (文字列リテラル)。
- type [in] 格納する関数ポインタの型 (例: sample_func_t)。

## 3.5 funcman_get_func

    #define funcman_get_func ( fobj, type )
        ((type)_funcman_get_func(fobj))

拡張関数ポインタを返します。

### 3.5.1 引数

- fobj [in] funcman_object へのポインタ。
- type [in] NEW_FUNCMAN_OBJECT で指定したものと同じ関数ポインタ型。

# 4 クラス/構造体

## 4.1 funcman_object

    struct funcman_object {
        const char *func_key;
        char[FUNCMAN_NAME_MAX] lib_name;
        char[FUNCMAN_NAME_MAX] func_name;
        MODULE_HANDLE handle;
        void *func_ptr;
        int resolved;
        int padding;
        pthread_mutex_t mutex;
    }

関数ポインタキャッシュエントリ。

ライブラリ名・関数名・ハンドル・関数ポインタおよび排他制御用ロックを管理します。
静的変数として定義する場合は NEW_FUNCMAN_OBJECT マクロで初期化してください。

### 4.1.1 属性

#### 4.1.1.1 func_key

    const char *func_key;

この関数インスタンスの識別キー。

#### 4.1.1.2 lib_name

    char[FUNCMAN_NAME_MAX] lib_name;

拡張子なしライブラリ名。[0]==‘\0’ = 未設定。

#### 4.1.1.3 func_name

    char[FUNCMAN_NAME_MAX] func_name;

関数シンボル名。[0]==‘\0’ = 未設定。

#### 4.1.1.4 handle

    MODULE_HANDLE handle;

キャッシュ済みハンドル (NULL = 未ロード)。

#### 4.1.1.5 func_ptr

    void *func_ptr;

キャッシュ済み関数ポインタ (NULL = 未取得)。

#### 4.1.1.6 resolved

    int resolved;

解決済フラグ (0 = 未解決)。

#### 4.1.1.7 padding

    int padding;

パディング。

#### 4.1.1.8 mutex

    pthread_mutex_t mutex;

ロード処理を保護する mutex (Linux)。