Document of c-modernization-kit (funcman) 1.0.0
Loading...
Searching...
No Matches
funcman_init.c
Go to the documentation of this file.
1
28
29#include <funcman.h>
30#include <stdio.h>
31#include <string.h>
32
34#define CONFIG_LINE_MAX 1024
35
36/* doxygen コメントは、ヘッダに記載 */
37void funcman_init(funcman_object *const *fobj_array, const size_t fobj_length, const char *configpath)
38{
39 FILE *fp;
40 char line[CONFIG_LINE_MAX];
41 char func_key[FUNCMAN_NAME_MAX];
42 char lib_name[FUNCMAN_NAME_MAX];
43 char func_name[FUNCMAN_NAME_MAX];
44 char *comment;
45 size_t fobj_index;
46
47#ifndef _WIN32
48 fp = fopen(configpath, "r");
49#else /* _WIN32 */
50 fopen_s(&fp, configpath, "r");
51#endif /* _WIN32 */
52 if (fp == NULL)
53 {
54 return;
55 }
56
57 while (fgets(line, sizeof(line), fp) != NULL)
58 {
59 /* '#' 以降をコメントとして切り捨てる (行頭 '#' も同様に処理される) */
60 comment = strchr(line, '#');
61 if (comment != NULL)
62 {
63 *comment = '\0';
64 }
65
66 /* func_key lib_name func_name の 3 フィールドを解析 */
67#ifndef _WIN32
68 if (sscanf(line, "%255s %255s %255s", func_key, lib_name, func_name) != 3)
69#else /* _WIN32 */
70 if (sscanf_s(line, "%255s %255s %255s",
71 func_key, (unsigned)sizeof(func_key),
72 lib_name, (unsigned)sizeof(lib_name),
73 func_name, (unsigned)sizeof(func_name)) != 3)
74#endif /* _WIN32 */
75 {
76 /* 空行・コメント行・フィールドが不足している行はスキップ */
77 continue;
78 }
79
80 /* func_key が一致するキャッシュを検索し、配列に書き込む */
81 for (fobj_index = 0; fobj_index < fobj_length; fobj_index++)
82 {
83 funcman_object *cache = fobj_array[fobj_index];
84 if (cache->func_key == NULL || strcmp(cache->func_key, func_key) != 0)
85 {
86 continue;
87 }
88
89#ifndef _WIN32
90 strncpy(cache->lib_name, lib_name, FUNCMAN_NAME_MAX - 1);
91 cache->lib_name[FUNCMAN_NAME_MAX - 1] = '\0';
92 strncpy(cache->func_name, func_name, FUNCMAN_NAME_MAX - 1);
93 cache->func_name[FUNCMAN_NAME_MAX - 1] = '\0';
94#else /* _WIN32 */
95 strncpy_s(cache->lib_name, FUNCMAN_NAME_MAX, lib_name, FUNCMAN_NAME_MAX - 1);
96 strncpy_s(cache->func_name, FUNCMAN_NAME_MAX, func_name, FUNCMAN_NAME_MAX - 1);
97#endif /* _WIN32 */
98 break;
99 }
100 }
101
102 fclose(fp);
103 return;
104}
関数動的呼び出し機構 (funcman) の公開 API ヘッダー。
#define FUNCMAN_NAME_MAX
lib_name / func_name 配列の最大長 (終端 '\0' を含む)。
Definition funcman.h:56
#define CONFIG_LINE_MAX
fgets で読み込む行バッファの最大長
void funcman_init(funcman_object *const *fobj_array, const size_t fobj_length, const char *configpath)
funcman_object ポインタ配列を初期化します。
関数ポインタキャッシュエントリ。
Definition funcman.h:67
char func_name[FUNCMAN_NAME_MAX]
関数シンボル名。[0]=='\0' = 未設定。
Definition funcman.h:70
char lib_name[FUNCMAN_NAME_MAX]
拡張子なしライブラリ名。[0]=='\0' = 未設定。
Definition funcman.h:69
const char * func_key
この関数インスタンスの識別キー。
Definition funcman.h:68