1
0

config_file.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. #include <string>
  2. #include <fstream>
  3. #include <iterator>
  4. #include <boost/regex.hpp>
  5. #include <log.h>
  6. #include <config_file.h>
  7. using boost::regex;
  8. using boost::cmatch;
  9. static void trim(char*b,char*e)
  10. {
  11. char*e1=e;
  12. for(;e1>b;--e1)
  13. {
  14. if(!std::isspace(e1[-1]))
  15. break;
  16. }
  17. char*b1=b;
  18. for(;b1<e1;++b1)
  19. {
  20. if(!std::isspace(*b1))
  21. break;
  22. }
  23. memmove(b,b1,e1-b1);
  24. b[e1-b1]=0;
  25. }
  26. int config_file::open(const char*fname)
  27. {
  28. _buf.reserve(1<<10);
  29. std::ifstream f(fname,std::ios_base::binary);
  30. if(!f)
  31. {
  32. log_errno("can't open the inifile:%s",fname);
  33. return -1;
  34. }
  35. f.unsetf(std::ios::skipws);
  36. std::copy(std::istream_iterator<char>(f),std::istream_iterator<char>(), std::back_inserter(_buf));
  37. _buf.push_back('\n');
  38. _buf.push_back('0');
  39. char*s=&_buf[0];
  40. char*e=&_buf.back();
  41. for(;s<e;)
  42. {
  43. char*p=strchr(s,'\n');
  44. if(p==0)
  45. break;
  46. *p=0;
  47. if(p==s)
  48. {
  49. s=p+1;
  50. continue;
  51. }
  52. char*v=strchr(s,'=');
  53. if(v==0)
  54. {
  55. s=p+1;
  56. continue;
  57. }
  58. char*r=strchr(v+1,'#');
  59. if(r) *r=0;
  60. else r=p;
  61. char*k=s;
  62. *p=0;
  63. *v=0;
  64. trim(k,v);
  65. v++;
  66. trim(v,r);
  67. _map.insert(std::make_pair(k,v));
  68. s=p+1;
  69. }
  70. return 0;
  71. }
  72. int config_file::get(const char*key,int default_v)const
  73. {
  74. auto it=_map.find(key);
  75. return it==_map.end()
  76. ? (log_info("config param: %s=%d(default)",key,default_v),default_v)
  77. : (log_info("config param: %s=%s",key,it->second), atoi(it->second));
  78. }
  79. int config_file::get(const char*sec,const char*key,int default_v)const
  80. {
  81. char k[512];
  82. sprintf(k,"%s.%s",sec,key);
  83. return get(k,default_v);
  84. }
  85. double config_file::get(const char*key,double default_v)const
  86. {
  87. auto it=_map.find(key);
  88. return it==_map.end()
  89. ? (log_info("config param: %s=%lf(default)",key,default_v),default_v)
  90. : (log_info("config param: %s=%s",key,it->second), atof(it->second));
  91. }
  92. double config_file::get(const char*sec,const char*key,double default_v)const
  93. {
  94. char k[512];
  95. sprintf(k,"%s.%s",sec,key);
  96. return get(k,default_v);
  97. }
  98. const char* config_file::get(const char*sec,const char*key,const char*v)const
  99. {
  100. char k[512];
  101. sprintf(k,"%s.%s",sec,key);
  102. return get(k,v);
  103. #if 0
  104. auto it=_map.find(k);
  105. return it==_map.end()
  106. ? get(k,v)
  107. : (log_info("config param: %s=%s",k,it->second),it->second);
  108. #endif
  109. }
  110. const char* config_file::get(const char*key,const char*defv)const
  111. {
  112. auto it=_map.find(key);
  113. return it==_map.end()
  114. ? (log_info("config param: %s=%s(default)",key,defv),defv)
  115. : (log_info("config param: %s=%s",key,it->second), it->second);
  116. }
  117. std::set<const char*> config_file::keys()const
  118. {
  119. std::set<const char*> ret;
  120. for(auto it:_map)
  121. ret.insert(it.first);
  122. return std::move(ret);
  123. }
  124. bool config_file::contains(const char*k)const
  125. {
  126. return _map.find(k)!=_map.end();
  127. }
  128. bool config_file::contains(const char*sec,const char*k)const
  129. {
  130. char key[512];
  131. snprintf(key,255,"%s.%s",sec,k);
  132. return contains(key);
  133. }
  134. void config_file::print(std::ostream&o)
  135. {
  136. for(auto &m:_map)
  137. o<<m.first<<"="<<m.second<<"\n";
  138. o<<std::ends;
  139. }