mirror of
https://gitlab.com/apparmor/apparmor
synced 2025-09-01 06:45:38 +00:00
Lindent + hand cleanups compressed-dfa
Signed-off-by: John Johansen <john.johansen@canonical.com> Acked-By: Steve Beattie <sbeattie@ubuntu.com>
This commit is contained in:
@@ -32,9 +32,9 @@
|
||||
#include "hfa.h"
|
||||
#include "compressed_hfa.h"
|
||||
|
||||
|
||||
void TransitionTable::init_free_list(vector<pair<size_t, size_t> > &free_list,
|
||||
size_t prev, size_t start) {
|
||||
size_t prev, size_t start)
|
||||
{
|
||||
for (size_t i = start; i < free_list.size(); i++) {
|
||||
if (prev)
|
||||
free_list[prev].second = i;
|
||||
@@ -48,19 +48,17 @@ void TransitionTable::init_free_list(vector <pair<size_t, size_t> > &free_list,
|
||||
* new Construct the transition table.
|
||||
*/
|
||||
TransitionTable::TransitionTable(DFA &dfa, map<uchar, uchar> &eq,
|
||||
dfaflags_t flags)
|
||||
: eq(eq)
|
||||
dfaflags_t flags): eq(eq)
|
||||
{
|
||||
|
||||
if (flags & DFA_DUMP_TRANS_PROGRESS)
|
||||
fprintf(stderr, "Compressing trans table:\r");
|
||||
|
||||
|
||||
if (eq.empty())
|
||||
max_eq = 255;
|
||||
else {
|
||||
max_eq = 0;
|
||||
for(map<uchar, uchar>::iterator i = eq.begin(); i != eq.end(); i++) {
|
||||
for (map<uchar, uchar>::iterator i = eq.begin();
|
||||
i != eq.end(); i++) {
|
||||
if (i->second > max_eq)
|
||||
max_eq = i->second;
|
||||
}
|
||||
@@ -80,9 +78,10 @@ TransitionTable::TransitionTable(DFA& dfa, map<uchar, uchar>& eq,
|
||||
if (flags & DFA_CONTROL_TRANS_HIGH) {
|
||||
size_t range = 0;
|
||||
if ((*i)->cases.cases.size())
|
||||
range = (*i)->cases.cases.rbegin()->first - (*i)->cases.begin()->first;
|
||||
size_t ord = ((256 - (*i)->cases.cases.size()) << 8) |
|
||||
(256 - range);
|
||||
range =
|
||||
(*i)->cases.cases.rbegin()->first -
|
||||
(*i)->cases.begin()->first;
|
||||
size_t ord = ((256 - (*i)->cases.cases.size()) << 8) | (256 - range);
|
||||
/* reverse sort by entry count, most entries first */
|
||||
order.insert(make_pair(ord, *i));
|
||||
}
|
||||
@@ -111,8 +110,7 @@ TransitionTable::TransitionTable(DFA& dfa, map<uchar, uchar>& eq,
|
||||
int count = 2;
|
||||
|
||||
if (!(flags & DFA_CONTROL_TRANS_HIGH)) {
|
||||
for (Partition::iterator i = dfa.states.begin(); i != dfa.states.end();
|
||||
i++) {
|
||||
for (Partition::iterator i = dfa.states.begin(); i != dfa.states.end(); i++) {
|
||||
if (*i != dfa.nonmatching && *i != dfa.start) {
|
||||
insert_state(free_list, *i, dfa);
|
||||
accept[num.size()] = (*i)->accept;
|
||||
@@ -122,13 +120,15 @@ TransitionTable::TransitionTable(DFA& dfa, map<uchar, uchar>& eq,
|
||||
if (flags & (DFA_DUMP_TRANS_PROGRESS)) {
|
||||
count++;
|
||||
if (count % 100 == 0)
|
||||
fprintf(stderr, "\033[2KCompressing trans table: insert state: %d/%ld\r", count, dfa.states.size());
|
||||
fprintf(stderr, "\033[2KCompressing trans table: insert state: %d/%ld\r",
|
||||
count, dfa.states.size());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (multimap<size_t, State *>::iterator i = order.begin();
|
||||
i != order.end(); i++) {
|
||||
if (i->second != dfa.nonmatching && i->second != dfa.start) {
|
||||
if (i->second != dfa.nonmatching &&
|
||||
i->second != dfa.start) {
|
||||
insert_state(free_list, i->second, dfa);
|
||||
accept[num.size()] = i->second->accept;
|
||||
accept2[num.size()] = i->second->audit;
|
||||
@@ -137,23 +137,28 @@ TransitionTable::TransitionTable(DFA& dfa, map<uchar, uchar>& eq,
|
||||
if (flags & (DFA_DUMP_TRANS_PROGRESS)) {
|
||||
count++;
|
||||
if (count % 100 == 0)
|
||||
fprintf(stderr, "\033[2KCompressing trans table: insert state: %d/%ld\r", count, dfa.states.size());
|
||||
fprintf(stderr, "\033[2KCompressing trans table: insert state: %d/%ld\r",
|
||||
count, dfa.states.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (flags & (DFA_DUMP_TRANS_STATS | DFA_DUMP_TRANS_PROGRESS)) {
|
||||
ssize_t size = 4 * next_check.size() + 6 * dfa.states.size();
|
||||
fprintf(stderr, "\033[2KCompressed trans table: states %ld, next/check %ld, optimal next/check %ld avg/state %.2f, compression %ld/%ld = %.2f %%\n", dfa.states.size(), next_check.size(), optimal, (float)next_check.size()/(float)dfa.states.size(), size, 512 * dfa.states.size(), 100.0 - ((float) size * 100.0 / (float)(512 * dfa.states.size())));
|
||||
fprintf(stderr, "\033[2KCompressed trans table: states %ld, next/check %ld, optimal next/check %ld avg/state %.2f, compression %ld/%ld = %.2f %%\n",
|
||||
dfa.states.size(), next_check.size(), optimal,
|
||||
(float)next_check.size() / (float)dfa.states.size(),
|
||||
size, 512 * dfa.states.size(),
|
||||
100.0 - ((float)size * 100.0 /(float)(512 * dfa.states.size())));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Does <cases> fit into position <base> of the transition table?
|
||||
*/
|
||||
bool TransitionTable::fits_in(vector <pair<size_t, size_t> > &free_list __attribute__((unused)),
|
||||
size_t pos, Cases& cases)
|
||||
bool TransitionTable::fits_in(vector<pair<size_t, size_t> > &free_list
|
||||
__attribute__ ((unused)), size_t pos,
|
||||
Cases &cases)
|
||||
{
|
||||
size_t c, base = pos - cases.begin()->first;
|
||||
for (Cases::iterator i = cases.begin(); i != cases.end(); i++) {
|
||||
@@ -246,26 +251,23 @@ do_insert:
|
||||
void TransitionTable::dump(ostream &os)
|
||||
{
|
||||
map<size_t, const State *> st;
|
||||
for (map<const State *, size_t>::iterator i = num.begin();
|
||||
i != num.end();
|
||||
i++) {
|
||||
for (map<const State *, size_t>::iterator i = num.begin(); i != num.end(); i++) {
|
||||
st.insert(make_pair(i->second, i->first));
|
||||
}
|
||||
|
||||
os << "size=" << default_base.size() << " (accept, default, base): {state} -> {default state}" << endl;
|
||||
os << "size=" << default_base.size() << " (accept, default, base): {state} -> {default state}" << "\n";
|
||||
for (size_t i = 0; i < default_base.size(); i++) {
|
||||
os << i << ": ";
|
||||
os << "(" << accept[i] << ", "
|
||||
<< num[default_base[i].first] << ", "
|
||||
<< default_base[i].second << ")";
|
||||
os << "(" << accept[i] << ", " << num[default_base[i].first]
|
||||
<< ", " << default_base[i].second << ")";
|
||||
if (st[i])
|
||||
os << " " << *st[i];
|
||||
if (default_base[i].first)
|
||||
os << " -> " << *default_base[i].first;
|
||||
os << endl;
|
||||
os << "\n";
|
||||
}
|
||||
|
||||
os << "size=" << next_check.size() << " (next, check): {check state} -> {next state} : offset from base" << endl;
|
||||
os << "size=" << next_check.size() << " (next, check): {check state} -> {next state} : offset from base\n";
|
||||
for (size_t i = 0; i < next_check.size(); i++) {
|
||||
if (!next_check[i].second)
|
||||
continue;
|
||||
@@ -283,7 +285,7 @@ void TransitionTable::dump(ostream& os)
|
||||
else
|
||||
os << (uchar) offs;
|
||||
}
|
||||
os << endl;
|
||||
os << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,8 +311,7 @@ string fill64(size_t i)
|
||||
return fill;
|
||||
}
|
||||
|
||||
template<class Iter>
|
||||
size_t flex_table_size(Iter pos, Iter end)
|
||||
template<class Iter> size_t flex_table_size(Iter pos, Iter end)
|
||||
{
|
||||
return pad64(sizeof(struct table_header) + sizeof(*pos) * (end - pos));
|
||||
}
|
||||
@@ -355,12 +356,12 @@ void TransitionTable::flex_table(ostream& os, const char *name)
|
||||
|
||||
if (default_base.size() >= (state_t) - 1) {
|
||||
cerr << "Too many states (" << default_base.size() << ") for "
|
||||
"type state_t" << endl;
|
||||
"type state_t\n";
|
||||
exit(1);
|
||||
}
|
||||
if (next_check.size() >= (trans_t) - 1) {
|
||||
cerr << "Too many transitions (" << next_check.size() << ") for "
|
||||
"type trans_t" << endl;
|
||||
cerr << "Too many transitions (" << next_check.size()
|
||||
<< ") for " "type trans_t\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -378,18 +379,14 @@ void TransitionTable::flex_table(ostream& os, const char *name)
|
||||
|
||||
vector<state_t> default_vec;
|
||||
vector<trans_t> base_vec;
|
||||
for (DefaultBase::iterator i = default_base.begin();
|
||||
i != default_base.end();
|
||||
i++) {
|
||||
for (DefaultBase::iterator i = default_base.begin(); i != default_base.end(); i++) {
|
||||
default_vec.push_back(num[i->first]);
|
||||
base_vec.push_back(i->second);
|
||||
}
|
||||
|
||||
vector<state_t> next_vec;
|
||||
vector<state_t> check_vec;
|
||||
for (NextCheck::iterator i = next_check.begin();
|
||||
i != next_check.end();
|
||||
i++) {
|
||||
for (NextCheck::iterator i = next_check.begin(); i != next_check.end(); i++) {
|
||||
next_vec.push_back(num[i->first]);
|
||||
check_vec.push_back(num[i->second]);
|
||||
}
|
||||
@@ -402,8 +399,7 @@ void TransitionTable::flex_table(ostream& os, const char *name)
|
||||
th.th_ssize = htonl(hsize +
|
||||
flex_table_size(accept.begin(), accept.end()) +
|
||||
flex_table_size(accept2.begin(), accept2.end()) +
|
||||
(eq.size() ?
|
||||
flex_table_size(equiv_vec.begin(), equiv_vec.end()) : 0) +
|
||||
(eq.size() ? flex_table_size(equiv_vec.begin(), equiv_vec.end()) : 0) +
|
||||
flex_table_size(base_vec.begin(), base_vec.end()) +
|
||||
flex_table_size(default_vec.begin(), default_vec.end()) +
|
||||
flex_table_size(next_vec.begin(), next_vec.end()) +
|
||||
@@ -412,11 +408,11 @@ void TransitionTable::flex_table(ostream& os, const char *name)
|
||||
os << th_version << (char)0 << name << (char)0;
|
||||
os << fill64(sizeof(th) + sizeof(th_version) + strlen(name) + 1);
|
||||
|
||||
|
||||
write_flex_table(os, YYTD_ID_ACCEPT, accept.begin(), accept.end());
|
||||
write_flex_table(os, YYTD_ID_ACCEPT2, accept2.begin(), accept2.end());
|
||||
if (eq.size())
|
||||
write_flex_table(os, YYTD_ID_EC, equiv_vec.begin(), equiv_vec.end());
|
||||
write_flex_table(os, YYTD_ID_EC, equiv_vec.begin(),
|
||||
equiv_vec.end());
|
||||
write_flex_table(os, YYTD_ID_BASE, base_vec.begin(), base_vec.end());
|
||||
write_flex_table(os, YYTD_ID_DEF, default_vec.begin(), default_vec.end());
|
||||
write_flex_table(os, YYTD_ID_NXT, next_vec.begin(), next_vec.end());
|
||||
|
@@ -35,9 +35,10 @@ public:
|
||||
TransitionTable(DFA &dfa, map<uchar, uchar> &eq, dfaflags_t flags);
|
||||
void dump(ostream & os);
|
||||
void flex_table(ostream &os, const char *name);
|
||||
void init_free_list(vector <pair<size_t, size_t> > &free_list, size_t prev, size_t start);
|
||||
bool fits_in(vector <pair<size_t, size_t> > &free_list,
|
||||
size_t base, Cases& cases);
|
||||
void init_free_list(vector<pair<size_t, size_t> > &free_list,
|
||||
size_t prev, size_t start);
|
||||
bool fits_in(vector<pair<size_t, size_t> > &free_list, size_t base,
|
||||
Cases &cases);
|
||||
void insert_state(vector<pair<size_t, size_t> > &free_list,
|
||||
State *state, DFA &dfa);
|
||||
|
||||
@@ -52,5 +53,4 @@ private:
|
||||
size_t first_free;
|
||||
};
|
||||
|
||||
|
||||
#endif /* __LIBAA_RE_COMPRESSED_HFA_H */
|
||||
|
Reference in New Issue
Block a user