config_file.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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:",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. const char* config_file::get(const char*sec,const char*key,const char*v)
  73. {
  74. char k[256];
  75. sprintf(k,"%s.%s",sec,key);
  76. auto it=_map.find(k);
  77. return it==_map.end()
  78. ? get(k,v)
  79. : (log_info("config param: %s=%s",k,it->second),it->second);
  80. }
  81. const char* config_file::get(const char*key,const char*defv)
  82. {
  83. auto it=_map.find(key);
  84. return it==_map.end()
  85. ? (log_info("config param: %s=%s(default)",key,defv),defv)
  86. : (log_info("config param: %s=%s",key,it->second), it->second);
  87. }
  88. std::set<const char*> config_file::keys()
  89. {
  90. std::set<const char*> ret;
  91. for(auto it:_map)
  92. ret.insert(it.first);
  93. return std::move(ret);
  94. }
  95. bool config_file::contains(const char*k)
  96. {
  97. return _map.find(k)!=_map.end();
  98. }
  99. bool config_file::contains(const char*sec,const char*k)
  100. {
  101. char key[256];
  102. snprintf(key,255,"%s.%s",sec,k);
  103. return contains(key);
  104. }
  105. void config_file::print(std::ostream&o)
  106. {
  107. for(auto &m:_map)
  108. o<<m.first<<"="<<m.second<<"\n";
  109. o<<std::ends;
  110. }