config

 #include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

#define COMMENT1 "//"
#define COMMENT2 "#"
unsigned int get_config_string(
    const char *node,
    const char *key,
    char *returnvalue,
    unsigned int length,
    const char *defaultvalue,
    const char *filefullname
    );
unsigned int mod_config_string(
    const char *node,
    const char *key,
    const char *orivlaue, //如果等于NULL,表示任何时候都替换成目标
    const char *destvalue,
    const char *filefullname
    );
   
 //find status查找状态
enum _tag_search_status{
  I_START=0,//初始状态
  I_KEYFOUND,//节点发现
  I_VALUEFIND,//配置建直发现
  I_ERR
 }search_status;
int main(int argc, char **argv)
{
       char configfile[FILENAME_MAX];
       char IP1[60];
       bzero(IP1,60);
       snprintf(configfile,FILENAME_MAX,"%s/scusys.cfg",getenv("HOME"));
       get_config_string("[node.0]","IP1",IP1,sizeof(IP1),"",file.c_str());
       fprintf(stdout,"IP1=%s",IP1);
       unsigned int ret=mod_config_string("[node.0]","IP1",NULL,"10.10.10.10",file.c_str());
       fprintf(stdout,"ret =%d",ret);
}
 
/*****************************************
 * 函数名:mod_config_string
 * 功能:根据文件名和配置名,将指定的值替换
 * first localte the pos of the key,compare the value is the origvalue
 * if its,mk a tempfile copy the not mod line;
 * mod the buff line to destvalue.
 * 返回值:替换后字符串的长度,0-表示替换不成功(没找到,或者跳过)
 * 参数:
 * 作者:masathem@163.com
 * 历史记录:
 *  1.0 2007-4-7 complete
 * ***************************************/
unsigned int mod_config_string(
                            const char *node,//配置节点名,如:[SCP],!=NULL
                            const char *key,//配置项名,!=NULL
                            const char *orivlaue, //原值,如果等于NULL,表示任何时候都替换成目标
                            const char *destvalue,//目标值,!=NULL
                            const char *filefullname//配置文件名
                            )
{
       //make sure all nessary para is not null
       if(NULL==node||NULL==key||filefullname==NULL||NULL==destvalue)
       {
              return 0;
       }
       char resultvalue[1024],buff[1024],aftersep[1024];
       char *str1,*str2;
       unsigned int pos=get_config_string(node,key,resultvalue,1024,"",filefullname);
       if(pos==0||strcmp(resultvalue,"")==0)
       {
              return 0;
       }
       if(orivlaue==NULL||strcmp(resultvalue,orivlaue)!=0)
       {
              //proceed relace
              //int tmpfd=mkstemp("mod_config");
              char *tmpfilename="mod_config9090.tmp";
              remove(tmpfilename);
              FILE *tmpfp=fopen(tmpfilename,"w+");
              FILE *orifp=fopen(filefullname,"r");
              int writesiz=0;
              if(orifp)
              {
                     //cpy the content before the key(pos)
                     for(int i=0;i<pos-1;i++)
                     {
                            bzero(buff,1024);
                            fgets(buff,1024,orifp);
                            if(buff==NULL)
                            {
                                   fclose(orifp);
                                   fclose(tmpfp);
                                   return 0;
                            }
                            writesiz=fputs(buff,tmpfp);
                            if((unsigned int)writesiz<0)
                            {
                                   fclose(orifp);
                                   fclose(tmpfp);
                                   return 0;
                            }
                     }
                     //
                     fgets(buff,1024,orifp);
                     str1=strstr(buff,"//");
                     //backup comment
                     if(str1!=NULL)
                     {
                            strncpy(aftersep,str1,1024);
                     }
                     str2=strstr(buff,"=");
                     memset(++str2,'/t',1);
                     strcpy(++str2,destvalue);
                     memset(str2+=strlen(destvalue),'/t',1);
                     str2++;
                     if(strlen(aftersep)>0)
                     {
                            strcpy(str2,aftersep);
                            str2+=strlen(aftersep);
                     }
                     fputs(buff,tmpfp);
                     while(fgets(buff,1024,orifp))
                     {
                            fputs(buff,tmpfp);
                     }
                     fclose(orifp);
                     fclose(tmpfp);
                     rename(tmpfilename,filefullname);
                     return sizeof(destvalue);
              }
       }
       return 0;
}
/*****************************************
 * 函数名:get_config_string
 * 功能:获取配置
 * 返回值:该健值在文件的多少行
 * 参数:
 * 作者:masathem@163.com
 * 历史记录:
 *   1.0 2007-4-7 complete
 * ***************************************/
unsigned int get_config_string(
                            const char *node,//配置节点名,如:[SCP],!=NULL
                            const char *key,//配置项名,!=NULL
                            char *returnvalue,//存储配置值
                            unsigned int length,//returnvalue的最大长度
                            const char *defaultvalue,//默认值
                            const char *filefullname//配置文件名
                            )
{
       search_status=I_START;
       //return value
       int nRet=1;
       char buff[8019];
       bzero(buff,8019);
       char *tstr;
       char *tstr1;
       char *tstr2;
       char *cRet=returnvalue;
       bool IS_START=false;
       //make sure all nessary para is not null
       if(NULL==node||NULL==key||filefullname==NULL)
       {
              return 0;
       }
       //give the def
       if(strlen(defaultvalue)>0)
       {
              strncpy(returnvalue,defaultvalue,strlen(defaultvalue)>length?length:strlen(defaultvalue));
       }
       FILE *fp=fopen(filefullname,"r");
       if(fp)
       {
              while(fgets(buff,8019,fp)!=NULL&search_status!=I_ERR)
              {
                     switch(search_status)
                     {
                            case I_START: //find the NODE
                            {
                                   //if the NODE find in the line
                                   if((tstr=strstr(buff,node))!=NULL)
                                   {
                                          tstr1=strstr(buff,COMMENT1);
                                          tstr1=tstr1==NULL?tstr+1:tstr1;
                                          tstr2=strstr(buff,COMMENT2);
                                          tstr2=tstr2==NULL?tstr+1:tstr2;
                                          //if find the NODE word postion in the left of comment1(2) is say NODE found
                                          if(strlen(tstr)>strlen(tstr1)&strlen(tstr)>strlen(tstr2))
                                          {
                                                 search_status=I_KEYFOUND;
                                          }
                                   }
                                   break;
                            }
                            case I_KEYFOUND://find the keyvalue,it's end with meet first char is '['
                            {
                                   if(buff[0]=='[')
                                   {
                                          search_status=I_ERR;
                                          break;
                                   }
                                   if((tstr=strstr(buff,key))!=NULL)
                                   {
                                          tstr1=strstr(buff,COMMENT1);
                                          tstr1=tstr1==NULL?tstr+1:tstr1;
                                          tstr2=strstr(buff,COMMENT2);
                                          tstr2=tstr2==NULL?tstr+1:tstr2;
                                          //if find the keyword postion in the left of comment1(2) is say key found
                                          if(strlen(tstr)>strlen(tstr1)&strlen(tstr)>strlen(tstr2))
                                          {
                                                 tstr=strstr(tstr,"=");
                                                 tstr++;
                                                 while(*tstr!='/0')
                                                 {
                                                        if(*tstr!='/t'&*tstr!=' ')
                                                        {
                                                               IS_START=true;
                                                               *cRet=*tstr;
                                                               cRet++;
                                                               tstr++;
                                                        }
                                                        else
                                                        {
                                                               if(IS_START)
                                                               break;
                                                               tstr++;
                                                        }
                                                 }
                                                 fclose(fp);
                                                 return nRet;
                                          }
                                   }
                                   break;
                            }
                            default:
                                   break;
                     }
                     bzero(buff,8019);
                     nRet++;
              }
       }
       fclose(fp);
       return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值