RuleSet.cc

Go to the documentation of this file.
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     // Just ignore if we have too many rules
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 } // namespace oasys
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

Generated on Fri Dec 22 14:48:00 2006 for DTN Reference Implementation by  doxygen 1.5.1