函数如下:
int init_parse_config_file(const char *fn)
{
char *data;
data = read_file(fn, 0); \\读取init.rc文件
if (!data) return -1;
parse_config(fn, data);\\解析init.rc 核心函数
DUMP();
return 0;
}
对函数parse_config分析:
static void parse_config(const char *fn, char *s)
{
struct parse_state state;
char *args[INIT_PARSER_MAXARGS];
int nargs;\\命令行
nargs = 0;
state.filename = fn;
state.line = 0;
state.ptr = s;\\命令行每个关键字字符串首地址
state.nexttoken = 0;
state.parse_line = parse_line_no_op;
for (;;) {
switch (next_token(&state)) {
case T_EOF:
state.parse_line(&state, 0, 0);
return;
case T_NEWLINE:
state.line++;
if (nargs) {
int kw = lookup_keyword(args[0]);
if (kw_is(kw, SECTION)) {
state.parse_line(&state, 0, 0);
parse_new_section(&state, kw, nargs, args);
} else {
state.parse_line(&state, nargs, args);
}
nargs = 0;
}
break;
case T_TEXT:
if (nargs < INIT_PARSER_MAXARGS) {
args[nargs++] = state.text;
}
break;
}
}
}