config_file.cpp 2.9 KB

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