]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/acl/BoolOps.cc
2 * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
10 #include "acl/BoolOps.h"
11 #include "acl/Checklist.h"
16 Acl::NotNode::NotNode(ACL
*acl
)
21 strncat(&name
[1], acl
->name
, sizeof(name
)-1-1);
28 // Not implemented: by the time an upper level parser discovers
29 // an '!' operator, there is nothing left for us to parse.
34 Acl::NotNode::doMatch(ACLChecklist
*checklist
, Nodes::const_iterator start
) const
36 assert(start
== nodes
.begin()); // we only have one node
38 if (checklist
->matchChild(this, start
, *start
))
39 return 0; // converting match into mismatch
41 if (!checklist
->keepMatching())
42 return -1; // suspend on async calls and stop on failures
44 return 1; // converting mismatch into match
48 Acl::NotNode::typeString() const
54 Acl::NotNode::clone() const
56 // Not implemented: we are not a named ACL type in squid.conf so nobody
57 // should try to create a NotNode instance by ACL type name (which is
58 // what clone() API is for -- it does not really clone anything).
64 Acl::NotNode::dump() const
67 text
.push_back(SBuf(name
));
74 Acl::AndNode::typeString() const
80 Acl::AndNode::clone() const
86 Acl::AndNode::doMatch(ACLChecklist
*checklist
, Nodes::const_iterator start
) const
88 // find the first node that does not match
89 for (Nodes::const_iterator i
= start
; i
!= nodes
.end(); ++i
) {
90 if (!checklist
->matchChild(this, i
, *i
))
91 return checklist
->keepMatching() ? 0 : -1;
94 // one and not zero on empty because in math empty product equals identity
95 return 1; // no mismatches found (i.e., all kids matched)
101 // Not implemented: AndNode cannot be configured directly. See Acl::AllOf.
108 Acl::OrNode::typeString() const
114 Acl::OrNode::clone() const
120 Acl::OrNode::bannedAction(ACLChecklist
*, Nodes::const_iterator
) const
126 Acl::OrNode::doMatch(ACLChecklist
*checklist
, Nodes::const_iterator start
) const
128 lastMatch_
= nodes
.end();
130 // find the first node that matches, but stop if things go wrong
131 for (Nodes::const_iterator i
= start
; i
!= nodes
.end(); ++i
) {
132 if (bannedAction(checklist
, i
))
134 if (checklist
->matchChild(this, i
, *i
)) {
139 if (!checklist
->keepMatching())
140 return -1; // suspend on async calls and stop on failures
143 // zero and not one on empty because in math empty sum equals zero
144 return 0; // all nodes mismatched
150 // Not implemented: OrNode cannot be configured directly. See Acl::AnyOf.