~ubuntu-branches/ubuntu/intrepid/tcm/intrepid

« back to all changes in this revision

Viewing changes to src/sd/bv/relevantset.c

  • Committer: Bazaar Package Importer
  • Author(s): Otavio Salvador
  • Date: 2003-07-03 20:08:21 UTC
  • Revision ID: james.westby@ubuntu.com-20030703200821-se4xtqx25e5miczi
Tags: upstream-2.20
ImportĀ upstreamĀ versionĀ 2.20

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include "relevantset.h"
 
2
#include "string.h"
 
3
#include <stdio.h>
 
4
 
 
5
RelevantSet::RelevantSet()
 
6
: EventSet() {
 
7
        memset(RelevantFlag, '\0', sizeof(RelevantFlag));
 
8
}
 
9
 
 
10
 
 
11
unsigned RelevantSet::add(const string &event) {
 
12
        unsigned u = EventSet::add(event);
 
13
        RelevantFlag[u >> 3] |= 0200 >> (u & 07);
 
14
        return u;
 
15
}
 
16
 
 
17
 
 
18
void RelevantSet::SetRelevant(const EventSet &relev) {
 
19
        memcpy(RelevantFlag, relev.EventFlag, sizeof(RelevantFlag));
 
20
}
 
21
 
 
22
 
 
23
void RelevantSet::print() {
 
24
        for ( int i = EventNames.count() ; i != 0 ; ) {
 
25
                --i;
 
26
                if ( EventFlag[i >> 3] & 0200 >> (i & 07) ||
 
27
                     RelevantFlag[i >> 3] & 0200 >> (i & 07) )
 
28
                        printf("%c%s ",
 
29
                                EventFlag[i >> 3] & 0200 >> (i & 07) ? '+' : '-',
 
30
                                EventNames[i].getstr());
 
31
        }
 
32
}
 
33
 
 
34
 
 
35
string RelevantSet::GetGuards() const {
 
36
        /* calculates a string composed of all the guards */
 
37
        string result;
 
38
        for ( int i = EventNames.count() ; i != 0 ; ) {
 
39
                --i;
 
40
                const string *str = &EventNames[i];
 
41
                if ( '[' == (*str)[0] && ']' == (*str)[str->length() - 1] &&
 
42
                    RelevantFlag[i >> 3] & 0200 >> (i & 07) ) {
 
43
                        if ( result.length() )
 
44
                                result += " and ";
 
45
                        result += '(';
 
46
                        string ev;
 
47
                        ev.add(str->getstr() + 1,
 
48
                                str->length() - 2);
 
49
                        if ( 0 == (EventFlag[i >> 3] & 0200 >> (i & 07)) )
 
50
                                for ( int j = 0 ; ; j++ ) {
 
51
                                        if ( j >= ev.length() ) {
 
52
                                                result += "not ";
 
53
                                                result += ev;
 
54
                                                break;
 
55
                                        }
 
56
                                        if ( '<' == ev[j] || '=' == ev[j] || '>' == ev[j] ) {
 
57
                                                result.add(ev.getstr(), j);
 
58
                                                if ( '=' == ev[j] ) {
 
59
                                                        result += '<';
 
60
                                                        result += &(ev.getstr()[j+1]);
 
61
                                                        result += " or ";
 
62
                                                        result.add(ev.getstr(),j);
 
63
                                                        result += '>';
 
64
                                                } else if ( '<' == ev[j] && '>' == ev[j+1] ) {
 
65
                                                        result += '=';
 
66
                                                        j++;
 
67
                                                } else {
 
68
                                                        result += char('>' + '<' - ev[j]);
 
69
                                                        if ( '=' == ev[j+1] )
 
70
                                                                j++;
 
71
                                                        else
 
72
                                                                result += '=';
 
73
                                                }
 
74
                                                result += &(ev.getstr()[j+1]);
 
75
                                                break;
 
76
                                        }
 
77
                                }
 
78
                        else
 
79
                                for ( int j = 0 ; ; j++ ) {
 
80
                                        if ( j >= ev.length() ) {
 
81
                                                result += ev;
 
82
                                                break;
 
83
                                        }
 
84
                                        if ( '<' == ev[j] && '>' == ev[j+1] ) {
 
85
                                                result.add(ev.getstr(), j);
 
86
                                                result += '<';
 
87
                                                result += &(ev.getstr()[j+2]);
 
88
                                                result += " or ";
 
89
                                                result.add(ev.getstr(), j);
 
90
                                                result += '>';
 
91
                                                result += &(ev.getstr()[j+2]);
 
92
                                                break;
 
93
                                        }
 
94
                                }
 
95
                        result += ')';
 
96
                }
 
97
        }
 
98
        return result;
 
99
}