ini 读取类

来源:互联网 发布:网络综艺节目优势 编辑:程序博客网 时间:2024/05/23 12:51
#ifndef _H_INI_INCLUDE#define _H_INI_INCLUDE#include <stdio.h>#include <stdlib.h>#include <string.h>//#include <dirent.h>#define STATIC static#define char_tolower(c)      (unsigned char) ((c >= 'A' && c <= 'Z') ? (c | 0x20) : c)#define char_toupper(c)      (unsigned char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)STATIC char *ltrim(char *s){    if (s)    {        while(*s && *s==' ')        {            s++;        }        return s;     }    return 0;}STATIC char *rtrim(char *s){    if (s)    {        char *p=s+strlen(s);        while(p!=s && (*p==' ' || *p==0) )        {            *p=0; p--;        }        return s;     }    return 0;}STATIC char *trim(char *s){    return rtrim(ltrim(s));}STATIC char *ltrim_section(char *s){    if (s)    {        while(*s && *s=='[')        {            s++;        }        return s;     }    return 0;}STATIC char *rtrim_section(char *s){    if (s)    {        char *p=s+strlen(s);        while(p!=s && (*p==']' || *p==0) )        {            *p=0; p--;        }        return s;     }    return 0;}STATIC char *trim_section(char *s){    return rtrim_section(ltrim_section(s));}/*STATIC char *str_tolower(char *s){    if (s)    {        char *p=s;        while(*p)        {            *p=char_tolower(*p);            p++;        }    }    return s;}STATIC char *str_toupper(char *s){    if (s)    {        char *p=s;        while(*p)        {            *p=char_toupper(*p);            p++;        }    }    return s;}*/#ifdef _NGX_STRING_H_INCLUDED_#define _strcasecmp   ngx_strcasecmp#define _strncasecmp  ngx_strncasecmp#elseSTATIC unsigned int _strcasecmp(unsigned char *s1, unsigned char *s2){    unsigned int  c1, c2;    for ( ;; ) {        c1 = (unsigned int) *s1++;        c2 = (unsigned int) *s2++;        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;        if (c1 == c2) {            if (c1) {                continue;            }            return 0;        }        return c1 - c2;    }}STATIC unsigned int strncasecmp(unsigned char *s1, unsigned char *s2, size_t n){    unsigned int  c1, c2;    while (n) {        c1 = (unsigned int) *s1++;        c2 = (unsigned int) *s2++;        c1 = (c1 >= 'A' && c1 <= 'Z') ? (c1 | 0x20) : c1;        c2 = (c2 >= 'A' && c2 <= 'Z') ? (c2 | 0x20) : c2;        if (c1 == c2) {            if (c1) {                n--;                continue;            }            return 0;        }        return c1 - c2;    }    return 0;}#endiftypedef struct{    unsigned int  len;    char         *buf;    unsigned int  nline;    char        **plines;    unsigned int  ngroup;    unsigned int *pgroup;}INIFILE;STATIC void scan_ini(INIFILE *ini){    char *pstr=ini->buf;    char *p;    unsigned int i,n;    for (i=0;i<ini->nline;i++)    {        p=pstr;        pstr=strchr(pstr,'\n');        pstr[0]=0;        p=(char *)trim(p);        if(*p=='[' && !strchr(p,'=')) ini->ngroup++;        pstr++;        ini->plines[i]=p;    }    ini->pgroup=(unsigned int *)malloc(ini->ngroup*sizeof(unsigned int));    if (ini->pgroup)    {        n=0;        for (i=0;i<ini->nline;i++)        {            if (*ini->plines[i]=='[' && !strchr(ini->plines[i],'='))            {                ini->pgroup[n]=i;                n++;            }        }    }        }STATIC void ini_free(INIFILE *ini, unsigned int freethis){    if (ini)    {        if (ini->pgroup) {free(ini->pgroup);ini->pgroup=0;}        if (ini->plines) {free(ini->plines);ini->plines=0;}        if (ini->buf)    {free(ini->buf);ini->buf=0;}        if (freethis)    free(ini);    }}STATIC INIFILE *ini_new(){    return (INIFILE *)malloc(sizeof(INIFILE));}STATIC unsigned int read_ini(INIFILE *ini, const char *file){    unsigned int ret;    unsigned int i;    ret=0;    if (ini)    {        memset(ini,0,sizeof(INIFILE));        FILE *pf=fopen(file,"rb");        if (pf)        {            fseek(pf,0,SEEK_END);            ini->len=ftell(pf);            if (ini->len)            {                ini->buf=(char *)malloc(ini->len+2);                if (ini->buf)                {                    i=0;                    fseek(pf,0,SEEK_SET);                    while(!feof(pf))                    {                        ini->buf[i]=fgetc(pf);                        if (ini->buf[i]=='\n') ini->nline++;                        if (ini->buf[i]!='\r') i++;                    }                    if (i && ini->buf[i-1]!='\n')                    {                        ini->buf[i]='\n';                        i++;                    }                    ini->buf[i]=0;                    if (ini->nline)                    {                        ini->plines=(char **)malloc(ini->nline*sizeof(char *));                        scan_ini(ini);                        ret=1;                    }                }            }            fclose(pf);        }    }    return ret;}STATIC const char *get_group(INIFILE * ini, unsigned int iGruop){    if (ini->plines && ini->pgroup)    {        return trim_section(ini->plines[ini->pgroup[iGruop]]);    }        return 0;}STATIC const char *get_key_str(INIFILE * ini, unsigned int iGruop, const char *szkey){    unsigned int in_keylen;        if (ini->plines && ini->pgroup && szkey && (in_keylen=strlen(szkey)) )    {        unsigned int i;        for (i=ini->pgroup[iGruop]+1;i<ini->nline;i++)        {            if (*ini->plines[i])            {                char keyname1[100];                char keyname2[100];                char *pval=strchr(ini->plines[i],'=');                if (pval)                {                    unsigned int th_keylen=pval-ini->plines[i];                    if (th_keylen)                    {                        if (th_keylen>=100) th_keylen=99;                        if (in_keylen>=100) in_keylen=99;                                                memcpy(keyname1,ini->plines[i],th_keylen);                        keyname1[th_keylen]=0;                        memcpy(keyname2,szkey,in_keylen);                        keyname2[in_keylen]=0;                        if ( _strcasecmp((unsigned char *)trim(keyname1),(unsigned char *)trim(keyname2))==0  )                        {                            pval++;                            return  trim(pval);                        }                    }                }else if (*trim(ini->plines[i])=='['){                    break;                }            }        }    }        return 0;}STATIC unsigned int get_key_uint(INIFILE * ini, unsigned int iGruop, const char *szkey){    unsigned int ret=0;    const char *p=get_key_str(ini,iGruop,szkey);    if (p && *p>='0' && *p<='9')    {        ret=(unsigned int)strtoul(p,0,10);    }    return ret;}#endif


原创粉丝点击