天天看點

sensors of function parse_config sourcecode.

int parse_config(FILE *input, const char *name)
{
	int err;
	char *name_copy;

	if (name) {
		/* Record configuration file name for error reporting */
		name_copy = strdup(name);
		if (!name_copy)
			sensors_fatal_error(__func__, "Out of memory");
		sensors_add_config_files(&name_copy);
	} else
		name_copy = NULL;

	if (sensors_scanner_init(input, name_copy)) {
		err = -SENSORS_ERR_PARSE;
		goto exit_cleanup;
	}
	err = sensors_parse();
	sensors_scanner_exit();
	if (err) {
		err = -SENSORS_ERR_PARSE;
		goto exit_cleanup;
	}

	err = sensors_substitute_busses();

exit_cleanup:
	free_config_busses();
	return err;
}
           

看起來一個短短的函數,其實作的工作不少。首先調用sensors_add_config_files,這個是條件調用,當然以精簡分析的原則,暫且不表。其次調用sensors_scanner_init()這個函數很明顯是自定義的,而且出錯傳回非零值。其次調用sensors_parse()和sensors_scanner_exit()。從名字上看sensors_parse是解析sensors的,很可能對已有的資訊進行解析和轉儲,因為接下來調用的函數是sensors_scanner_exit()這個很明顯是結束對傳感器的掃描的。而列印資訊的函數一定會在main函數調用。那麼main函數中的setdgstr和print_bus_list函數的作用就顯而易見了。(這兩人個函數見main函數源碼,「中調用」,至于源碼也暫且不表。)至于如何擷取的資訊,那麼從函數名中就可以看出是sensors_scanner_init()這個函數擷取最原始的資訊,感覺好像找到了一直在找的目标。至于怎麼獲緻我們還是看源碼吧,很可能又是一顆不小的樹。應該一定是。對于一個202k大小的包,不可以就這麼分析完的。202K對于手機應用來說好像沒這麼小的包。但對于這兒來說真的是不大不小了。也許這就是linux的魅力所在吧。

int sensors_scanner_init(FILE *input, const char *filename)
{
	BEGIN(0);
	if (!(scan_buf = sensors_yy_create_buffer(input, YY_BUF_SIZE)))
		return -1;

	sensors_yy_switch_to_buffer(scan_buf);
	sensors_yyfilename = filename;
	sensors_yylineno = 1;
	return 0;
}
           

源檔案名conf-lex.l這個函數會照樣輸出到.c源檔案中。至于sensors_yy_switch_to_buffer()

sensors_yyfilename

sensors_yylineno的定義一定在.l的輸出檔案中它的輸出一般會很大。

不知道怎麼回事,後面的幾個

轉載于:https://my.oschina.net/u/2418118/blog/914115