• Linux C实现小项目配置文件读取


    /*************************************************************************
            > File Name: Cfg.h
            > Author: zhoulin 
            > Created Time: Wed 16 Mar 2016 06:17:27 PM CST
     ************************************************************************/
    项目需要,有时候需要读取配置文件,大多以kv的方式。该小程序仅仅是读取字符,控制字符和空白行,空白字符是不读取的。
    #ifndef _Cfg_H
    #define WORD "="
    typedef struct _Item
    {
        void *K;
        void *V;
        struct _Item *Next;
    }Item;
    typedef struct _Node
    {
        int Size;
        char *Base;
        struct _Node *Next;
        struct _Item *iHead;
    }Node;
    typedef struct _Cfg 
    {
        int Size;
        struct _Node *nHead;
    }Cfg;
    Cfg *CfgNew(const char *path);
    Node *GetNodeByBase(char *base,Cfg *cfg);
    char  *GetValByKey(char *base,char *key,Cfg *Cfg);
    int CfgFree(Cfg *cfg);
    #define _Cfg_H
    #endif
    /*************************************************************************
            > File Name: Cfg.c
            > Author: zhoulin 
            > Created Time: Wed 16 Mar 2016 06:31:46 PM CST
     ************************************************************************/
    
    #include "cfg.h"
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    #define bufSize  1024
    char *trimSp(char *buf)
    {
        char tbuf[bufSize] = {''};
        if(buf == NULL || strlen(buf) ==0)
        {
            return NULL;
        }
        int len = strlen(buf);
        int i = 0, j =0;
        while(i < len)
        {
            if(iscntrl(buf[i]) ==0 && isspace(buf[i]) ==0)
            {
                tbuf[j] = buf[i];
                j++;
            }
            i++;
        }
        memset(buf,'',len);
        strncpy(buf,tbuf,strlen(tbuf));
        return buf;
    }
    int getPos(char *buf)
    {
        if(buf == NULL || strlen(buf) == 0)
        {
            return -1;
        }
        int len = strlen(buf);
        int i = 0;
        while(i < len)
        {
            if(buf[i] == '='){
                break;
            }
            i++;
        }
        return i++;
    }
    Cfg *CfgNew(const char *path)
    {
        Cfg *cfg = NULL;
        if(path == NULL || strlen(path) == 0)
        {
            return NULL;
        }
        FILE *fp = fopen(path,"r");
        char buf[bufSize] = {''};
        if(fp == NULL)
        {
            return NULL;
        }
        cfg = (Cfg *)malloc(sizeof(*cfg));
        while(fgets(buf,bufSize,fp) != NULL)
        {
            char *tbuf = trimSp(buf);
            int pos = getPos(tbuf);
            int len = strlen(tbuf);
            if(len > 0 && len == pos  && tbuf[0] == '[' && tbuf[len-1] == ']')
            {
                Node *tmp = (Node *)malloc(sizeof(*tmp));
                tmp->Base = (char *)malloc(len-1);
                memset(tmp->Base,'',len-1);
                strncpy(tmp->Base,tbuf+1,len-2);
                if(cfg->nHead == NULL)
                {
                    cfg->nHead  = tmp;
                }else{
                    tmp->Next =cfg->nHead;
                    cfg->nHead = tmp;
                }
                cfg->Size++;
            }else{
                if(len > 0 && pos != len)
                {
                    Node *h = cfg->nHead;
                    char *val = tbuf + pos+1;
                    tbuf[pos] = '';
                    char *key = tbuf;
                    int k_len = strlen(key);
                    int v_len = strlen(val);
                    Item *t = h->iHead;
                    if(t == NULL) {
                        t = (Item *)malloc(sizeof(*t));
                        h->iHead = t;
                    }else {
                        Item *cur = (Item *)malloc(sizeof(*cur));
                        cur->Next = h->iHead;
                        h->iHead = cur;
                    }
                    h->iHead->K = (char *)malloc(k_len+1);
                    h->iHead->V = (char *)malloc(v_len+1);
                    memset(h->iHead->K,'',k_len+1);
                    memset(h->iHead->V,'',v_len+1);
                    strncpy(h->iHead->K,key,k_len);
                    strncpy(h->iHead->V,val,v_len);
                    h->Size++;
                }
            }
        memset(buf,'',bufSize);
        }
        if(fp != NULL){
            fclose(fp);
        }
        if(cfg->Size == 0){
            free(cfg);
            cfg = NULL;
        }
        return cfg;
    }
    static void prtCfg(Cfg *m)
    {
        printf("cfg =%p,cfg->Size=%d
    ",m,m->Size);
        Node *cur = m->nHead;
        while(cur != NULL)
        {
            printf("   -----cur node=%p,next =%p,base= %s[len=%d],size =%d
    ",cur,cur->Next,
                   cur->Base,strlen(cur->Base),cur->Size);
            Item *icur = cur->iHead;
            while(icur != NULL)
            {
                printf("        *******cur item=%p,next =%p,key[len=%d] = %s,val[len=%d] = %s
    ",icur,icur->Next,
                       strlen(icur->K),icur->K,strlen(icur->V),icur->V);
                icur = icur ->Next;
            }
            cur = cur->Next;
        }
    }
    Node *GetNodeByBase(char *base,Cfg *cfg)
    {
        Node *nv = NULL;
        if(cfg == NULL) {
            return nv;
        }
        Node *cur = cfg->nHead;
        while(cur != NULL)
        {
            if(strncmp(cur->Base,base,strlen(cur->Base)) == 0)
            {
                nv = cur;
            }
            cur = cur->Next;
        }
        return nv;
    }
    char  *GetValByKey(char *base,char *key,Cfg *cfg)
    {
        char  *val = NULL;
        if(cfg == NULL || cfg->Size <= 0){
            return NULL;
        }
        Node *cur = cfg->nHead;
        while(cur != NULL)
        {
            if(strncmp(cur->Base,base,strlen(cur->Base)) == 0)
            {
                Item *icur = cur->iHead;
                while(icur != NULL)
                {
                    if(strncmp(icur->K,key,strlen(icur->K)) == 0){
                        val = icur->V;
                        break;
                    }
                    icur = icur->Next;
                }
            }
            cur = cur->Next;
        }
        return val;
    }
    int  CfgFree(Cfg *cfg)
    {
        if(cfg == NULL || cfg->Size ==0)
        {
            return -1;
        }
        Node *cur = cfg->nHead;
        while(cur != NULL)
        {
            Item *icur = cur->iHead;
            while(icur != NULL)
            {
                printf("        ******** free icur=%p,next=%p********
    ",icur,icur->Next);
                free(icur->K);
                free(icur->V);
                free(icur);
                icur->K = icur->V = NULL;
                icur = icur ->Next;
            }
            if(icur != NULL){
                icur = NULL;
            }
            printf("******** free node=%p,next=%p********
    ",cur,cur->Next);
            free(cur->Base);
            free(cur);
            cur->Base =  NULL;
            cur = cur->Next;
        }
        if(cur != NULL){
            cur = NULL;
        }
        return 0;
    }
    int main(void)
    {
        Cfg *m = CfgNew("./test");
        prtCfg(m);
        char *v = GetValByKey("mysql","port",m);
        Node *t = GetNodeByBase("tr",m);
        if(t != NULL)
        {
            printf("%p,base =%s,size =%d
    ",t,t->Base,t->Size);
            Item *x = t->iHead;
            while(x != NULL)
            {
                printf("cur = %p,next =%p,k=%s,v=%s
    ",x,x->Next,x->K,x->V);
                x = x->Next;
            }
        }
        printf("v =%s
    ",v);
        char *v1 = GetValByKey("tr","bn",m);
        printf("v1 =%s
    ",v1);
        printf("free =%d
    ",CfgFree(m));
        return 0;
    }

    运行结果:

    测试的test文件:

    [ ok ]
    v1 =v2
    k3 = v3
    #k
            #df
    dddd
      #[dd]
    KK   #  D
    KK = == V
            [yu]
            dgf = fd
    [mysql]
    user = root
    
    port = 4450
    
    [tr]
        #comment
      t1  = vo
      m2 == max
    bn====m8
    

      

    cfg =0x23da250,cfg->Size=4
       -----cur node=0x23da5a0,next =0x23da490,base= tr[len=2],size =3
            *******cur item=0x23da6b0,next =0x23da650,key[len=2] = bn,val[len=5] = ===m8
            *******cur item=0x23da650,next =0x23da5f0,key[len=2] = m2,val[len=4] = =max
            *******cur item=0x23da5f0,next =(nil),key[len=2] = t1,val[len=2] = vo
       -----cur node=0x23da490,next =0x23da3e0,base= mysql[len=5],size =2
            *******cur item=0x23da540,next =0x23da4e0,key[len=4] = port,val[len=4] = 4450
            *******cur item=0x23da4e0,next =(nil),key[len=4] = user,val[len=4] = root
       -----cur node=0x23da3e0,next =0x23da270,base= yu[len=2],size =1
            *******cur item=0x23da430,next =(nil),key[len=3] = dgf,val[len=2] = fd
       -----cur node=0x23da270,next =(nil),base= ok[len=2],size =3
            *******cur item=0x23da380,next =0x23da320,key[len=2] = KK,val[len=3] = ==V
            *******cur item=0x23da320,next =0x23da2c0,key[len=2] = k3,val[len=2] = v3
            *******cur item=0x23da2c0,next =(nil),key[len=2] = v1,val[len=2] = v2
    0x23da5a0,base =tr,size =3
    cur = 0x23da6b0,next =0x23da650,k=bn,v====m8
    cur = 0x23da650,next =0x23da5f0,k=m2,v==max
    cur = 0x23da5f0,next =(nil),k=t1,v=vo
    v =4450
    v1 ====m8
            ******** free icur=0x23da6b0,next=0x23da650********
            ******** free icur=0x23da650,next=0x23da5f0********
            ******** free icur=0x23da5f0,next=(nil)********
    ******** free node=0x23da5a0,next=0x23da490********
            ******** free icur=0x23da540,next=0x23da4e0********
            ******** free icur=0x23da4e0,next=(nil)********
    ******** free node=0x23da490,next=0x23da3e0********
            ******** free icur=0x23da430,next=(nil)********
    ******** free node=0x23da3e0,next=0x23da270********
            ******** free icur=0x23da380,next=0x23da320********
            ******** free icur=0x23da320,next=0x23da2c0********
            ******** free icur=0x23da2c0,next=(nil)********
    ********
    

      

  • 相关阅读:
    《编程之美》
    Fx Composer2.5 在Win8.1下无法运行的解决方法
    纹理坐标的探讨
    随机取两个点 ( 容易犯错的 do while )
    X文件(待续)
    函数指针
    安装DirectX SDK时出现Error Code:s1023 的解决方案(转)
    光与材质
    视棱锥
    D3D支持的图元类型
  • 原文地址:https://www.cnblogs.com/innobase/p/5290927.html
Copyright © 2020-2023  润新知