一、读取配置文件
/*
* 读取用户的配置文件
*/
void LoadConfig (Bool bMode)
{
FILE *fp;
char buf[PATH_MAX], *pbuf, *pbuf1;
Bool bFromUser = True;// 用以标识配置文件是用户家目录下的,还是从安装目录下拷贝过来的。
int group_idx, i;
Configure *tmpconfig;// 见解说[1]
bIsReloadConfig = bMode;// 这是一个全局变量,定义于“src/tool.c[193]"
pbuf = getenv("HOME");// 从环境变量中获取当前用户家目录的绝对路径
if(!pbuf){
fprintf(stderr, "error: get environment variable HOME\n");
exit(1); // 其实我绝对这儿也可以不退出的。只是处理起来有点烦。
// 需要注意需要直接使用安装目录里面的配置文件,而且不能网配置文件里面写了。直接推出的方法,简单。
}
snprintf(buf, PATH_MAX, "%s/.fcitx/config", pbuf);// 获取配置文件的绝对路径
fp = fopen(buf, "r");// 打开配置文件,如果打不开,说明不存在。就从安装目录里面拷贝一份默认的过来。
if(!fp && errno == ENOENT){ /* $HOME/.fcitx/config does not exist */
snprintf(buf, PATH_MAX, PKGDATADIR "/data/config");
bFromUser = False;
fp = fopen(buf, "r");
if(!fp){
perror("fopen");
exit(1);// 如果安装目录里面也没有配置文件,那就没办法了。只好告诉用户,无法运行了。
}
}
if(!bFromUser) /* create default configure file */
SaveConfig();// 解说[2]
group_idx = -1;//用于标示group的index,在配置文件里面配置是分组的,类似与ini文件的分组。
/* FIXME: 也许应该用另外更恰当的缓冲区长度 */
while(fgets(buf, PATH_MAX, fp)){
// 每次最多读入PATH_MAX大小的数据。
i = strlen(buf);
if(buf[i-1] != '\n'){
// 这行代码决定了,fcitx的配置文件每行最多是PATH_MAX个字符。
// 如果多余PATH_MAX个字符,就会退出。这也是为什么在前面作者留下那个FIXME的原因。
fprintf(stderr, "error: configure file: line length\n");
exit(1);
}else
buf[i-1] = '\0';// 给字符串做个封口。否则可能会出现问题。
// 比如上一次读入25个字符,这一次仅仅读入2个ÿ