searchPattern.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <algorithm>
  2. #include <sstream>
  3. #include "searchPattern.hh"
  4. #include "jsonObjectEntry.hh"
  5. #include "jsonPrimitive.hh"
  6. SearchPattern::SearchPattern(const char *input): flags(0)
  7. {
  8. size_t pos = 0;
  9. bool escaped = false;
  10. std::stringstream ss;
  11. for (pos =0; input[pos]; ++pos)
  12. {
  13. if (escaped)
  14. {
  15. if (input[pos] == '/')
  16. ss.put(input[pos]);
  17. else
  18. ss.put('\\').put(input[pos]);
  19. escaped = false;
  20. }
  21. else if (input[pos] == '\\')
  22. escaped = true;
  23. else if (input[pos] == '/')
  24. {
  25. pattern = ss.str();
  26. evalFlags(&input[pos +1]);
  27. return;
  28. }
  29. else
  30. ss.put(input[pos]);
  31. }
  32. pattern = ss.str();
  33. }
  34. SearchPattern::~SearchPattern()
  35. { }
  36. void SearchPattern::evalFlags(const char *s)
  37. {
  38. while (*s)
  39. {
  40. if (*s == 'i')
  41. {
  42. flags |= SearchPattern::FLAG_CASE;
  43. std::transform(pattern.begin(), pattern.end(), pattern.begin(), ::tolower);
  44. }
  45. else if (*s == 'b')
  46. typeFlag = SearchPattern::TYPE_BOOL;
  47. else if (*s == 'n')
  48. typeFlag = SearchPattern::TYPE_NUMBER;
  49. else if (*s == 's')
  50. typeFlag = SearchPattern::TYPE_STRING;
  51. else if (*s == 'o')
  52. typeFlag = SearchPattern::TYPE_OBJKEY;
  53. else if (*s == 'w')
  54. flags |= SearchPattern::FLAG_WHOLEWORD;
  55. else if (*s == 'f')
  56. flags |= SearchPattern::FLAG_WHOLESTR;
  57. s++;
  58. }
  59. }
  60. bool SearchPattern::isEmpty() const
  61. { return pattern.empty(); }
  62. bool SearchPattern::operator()(char a, char b)
  63. {
  64. if (a == '\t')
  65. a = ' ';
  66. if (flags & SearchPattern::FLAG_CASE)
  67. return std::tolower(a) == b;
  68. return a == b;
  69. }
  70. bool SearchPattern::match(const std::string &str, const JSonElement *type) const
  71. {
  72. if (typeFlag)
  73. {
  74. if (typeFlag == SearchPattern::TYPE_BOOL && !(dynamic_cast<const JSonPrimitive<bool> *>(type)))
  75. return false;
  76. else if (typeFlag == SearchPattern::TYPE_STRING && !(dynamic_cast<const JSonPrimitive<std::string> *>(type)))
  77. return false;
  78. else if (typeFlag == SearchPattern::TYPE_OBJKEY && !(dynamic_cast<const JSonObjectEntry *>(type)))
  79. return false;
  80. else if (typeFlag == SearchPattern::TYPE_NUMBER &&
  81. !(dynamic_cast<const JSonPrimitive<int> *>(type)) &&
  82. !(dynamic_cast<const JSonPrimitive<double> *>(type)) &&
  83. !(dynamic_cast<const JSonPrimitive<long long> *>(type)))
  84. return false;
  85. }
  86. if ((flags & FLAG_WHOLESTR && str.length() != pattern.length())
  87. || pattern.length() > str.length())
  88. return false;
  89. if (flags & FLAG_WHOLEWORD && str.length() > pattern.length())
  90. {
  91. std::string pattern = ' ' +this->pattern +' ';
  92. return std::search(str.begin(), str.end(), pattern.begin(), pattern.end(), *this) != str.end();
  93. }
  94. return std::search(str.begin(), str.end(), pattern.begin(), pattern.end(), *this) != str.end();
  95. }
  96. const short SearchPattern::FLAG_CASE = 1;
  97. const short SearchPattern::FLAG_WHOLEWORD = 2;
  98. const short SearchPattern::FLAG_WHOLESTR = 4;
  99. const short SearchPattern::TYPE_BOOL = 1;
  100. const short SearchPattern::TYPE_NUMBER = 2;
  101. const short SearchPattern::TYPE_STRING = 3;
  102. const short SearchPattern::TYPE_OBJKEY = 4;