00001 #include <cstring>
00002 #include <algorithm>
00003
00004 #include "Glob.h"
00005 #include "RuleSet.h"
00006
00007 namespace oasys {
00008
00009
00010 RuleSet::RuleSet(RuleStorage* rs)
00011 : rules_(rs), num_rules_(0)
00012 {}
00013
00014
00015 RuleStorage::Item*
00016 RuleSet::match_rule(char* rule)
00017 {
00018 RuleStorage::Item* match = 0;
00019 int cur_priority = -1000;
00020
00021 for (unsigned int i = 0; i < num_rules_; ++i)
00022 {
00023 RuleStorage::Item* item = &rules_->items_[i];
00024 if (do_match(rule, item) && item->priority_ > cur_priority)
00025 {
00026 match = item;
00027 cur_priority = item->priority_;
00028 }
00029 }
00030
00031 return match;
00032 }
00033
00034
00035 void
00036 RuleSet::add_prefix_rule(char* rule, int log_level)
00037 {
00038 add_rule(PREFIX, rule, log_level, strlen(rule));
00039 }
00040
00041
00042 void
00043 RuleSet::add_glob_rule(char* rule, int log_level, int priority)
00044 {
00045 add_rule(GLOB, rule, log_level, priority);
00046 }
00047
00048
00049 void
00050 RuleSet::add_rule(int flags, char* rule, int log_level, int priority)
00051 {
00052
00053 if (num_rules_ > rules_->MAX_RULES) {
00054 return;
00055 }
00056
00057 RuleStorage::Item* item;
00058
00059 item = &rules_->items_[num_rules_];
00060 memcpy(item->rule_, rule, std::min(rules_->MAX_RULE_LENGTH, strlen(rule)));
00061 item->flags_ = flags;
00062 item->log_level_ = log_level;
00063 item->priority_ = priority;
00064
00065 num_rules_++;
00066 }
00067
00068
00069 bool
00070 RuleSet::do_match(char* rule, RuleStorage::Item* item)
00071 {
00072 switch (item->flags_) {
00073 case PREFIX:
00074 if (strstr(rule, item->rule_) == rule) {
00075 return true;
00076 }
00077 break;
00078 case GLOB:
00079 if (Glob::fixed_glob(item->rule_, rule)) {
00080 return true;
00081 }
00082 break;
00083 }
00084
00085 return false;
00086 }
00087
00088 }
00089
00090 #if 0
00091
00092 #include <stdio.h>
00093
00094 void
00095 test(oasys::RuleSet* rs, char* rule)
00096 {
00097 oasys::RuleStorage::Item* item;
00098
00099 item = rs->match_rule(rule);
00100 if (item == 0) {
00101 printf("%s - no match\n", rule);
00102 } else {
00103 printf("%s:%s - %d\n", rule, item->rule_, item->log_level_);
00104 }
00105 }
00106
00107 int
00108 main()
00109 {
00110 oasys::RuleStorage s;
00111 oasys::RuleSet rs(&s);
00112
00113 rs.add_prefix_rule("/foo", 1);
00114 rs.add_prefix_rule("/foo/bar", 2);
00115 rs.add_glob_rule("*baz", 3, 1000);
00116 rs.add_glob_rule("*middle*", 4, 1000);
00117
00118 test(&rs, "/foo");
00119 test(&rs, "/foo/gar");
00120 test(&rs, "/foo/bar");
00121 test(&rs, "/foo/bart");
00122 test(&rs, "/foo/bar/boo");
00123 test(&rs, "/foo/baz");
00124 test(&rs, "/this/is/a");
00125 test(&rs, "/this/is/a/long/baz");
00126 test(&rs, "/thismiddle");
00127 }
00128
00129 #endif