/*
- * Copyright (C) 1996-2014 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2021 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
#include "squid.h"
#include "acl/FilledChecklist.h"
#include "acl/HttpStatus.h"
-#include "cache_cf.h"
#include "Debug.h"
#include "HttpReply.h"
#include <climits>
-static void aclParseHTTPStatusList(SplayNode<acl_httpstatus_data *> **curlist);
+static void aclParseHTTPStatusList(Splay<acl_httpstatus_data *> **curlist);
static int aclHTTPStatusCompare(acl_httpstatus_data * const &a, acl_httpstatus_data * const &b);
-static int aclMatchHTTPStatus(SplayNode<acl_httpstatus_data*> **dataptr, Http::StatusCode status);
+static int aclMatchHTTPStatus(Splay<acl_httpstatus_data*> **dataptr, Http::StatusCode status);
acl_httpstatus_data::acl_httpstatus_data(int x) : status1(x), status2(x) { ; }
ACLHTTPStatus::~ACLHTTPStatus()
{
- if (data)
- data->destroy(SplayNode<acl_httpstatus_data*>::DefaultFree);
+ if (data) {
+ data->destroy();
+ delete data;
+ }
}
char const *
void
ACLHTTPStatus::parse()
{
+ if (!data)
+ data = new Splay<acl_httpstatus_data*>();
+
aclParseHTTPStatusList (&data);
}
void
-aclParseHTTPStatusList(SplayNode<acl_httpstatus_data *> **curlist)
+aclParseHTTPStatusList(Splay<acl_httpstatus_data *> **curlist)
{
- char *t = NULL;
- SplayNode<acl_httpstatus_data*> **Top = curlist;
- acl_httpstatus_data *q = NULL;
-
- while ((t = strtokFile())) {
- if ((q = aclParseHTTPStatusData(t)) == NULL)
- continue;
-
- *Top = (*Top)->insert(q, acl_httpstatus_data::compare);
+ while (char *t = ConfigParser::strtokFile()) {
+ if (acl_httpstatus_data *q = aclParseHTTPStatusData(t))
+ (*curlist)->insert(q, acl_httpstatus_data::compare);
}
}
}
int
-aclMatchHTTPStatus(SplayNode<acl_httpstatus_data*> **dataptr, const Http::StatusCode status)
+aclMatchHTTPStatus(Splay<acl_httpstatus_data*> **dataptr, const Http::StatusCode status)
{
-
acl_httpstatus_data X(status);
- SplayNode<acl_httpstatus_data*> **Top = dataptr;
- *Top = Top[0]->splay(&X, aclHTTPStatusCompare);
+ const acl_httpstatus_data * const * result = (*dataptr)->find(&X, aclHTTPStatusCompare);
- debugs(28, 3, "aclMatchHTTPStatus: '" << status << "' " << (splayLastResult ? "NOT found" : "found"));
- return (0 == splayLastResult);
+ debugs(28, 3, "aclMatchHTTPStatus: '" << status << "' " << (result ? "found" : "NOT found"));
+ return (result != NULL);
}
static int
return 0;
}
-static void
-aclDumpHTTPStatusListWalkee(acl_httpstatus_data * const &node, void *state)
-{
- // state is a SBufList*
- static_cast<SBufList *>(state)->push_back(node->toStr());
-}
+struct HttpStatusAclDumpVisitor {
+ SBufList contents;
+ void operator() (const acl_httpstatus_data * node) {
+ contents.push_back(node->toStr());
+ }
+};
SBufList
ACLHTTPStatus::dump() const
{
- SBufList w;
- data->walk(aclDumpHTTPStatusListWalkee, &w);
- return w;
+ HttpStatusAclDumpVisitor visitor;
+ data->visit(visitor);
+ return visitor.contents;
}