3.LoadConfig及LoadProfile函数

一、读取配置文件

/*
 * 读取用户的配置文件
 */
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个ÿ
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值