]> git.ipfire.org Git - thirdparty/squid.git/blame_incremental - src/base/RegexPattern.cc
Fix SQUID_YESNO 'syntax error near unexpected token' (#2117)
[thirdparty/squid.git] / src / base / RegexPattern.cc
... / ...
CommitLineData
1/*
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9#include "squid.h"
10#include "base/RegexPattern.h"
11#include "base/TextException.h"
12#include "debug/Stream.h"
13#include "sbuf/Stream.h"
14
15#include <iostream>
16#include <utility>
17
18RegexPattern::RegexPattern(const SBuf &aPattern, const int aFlags):
19 pattern(aPattern),
20 flags(aFlags)
21{
22 memset(&regex, 0, sizeof(regex)); // paranoid; POSIX does not require this
23 if (const auto errCode = regcomp(&regex, pattern.c_str(), flags)) {
24 char errBuf[256];
25 // for simplicity, ignore any error message truncation
26 (void)regerror(errCode, &regex, errBuf, sizeof(errBuf));
27 // POSIX examples show no regfree(&regex) after a regcomp() error;
28 // presumably, regcom() frees any allocated memory on failures
29 throw TextException(ToSBuf("POSIX regcomp(3) failure: (", errCode, ") ", errBuf,
30 Debug::Extra, "regular expression: ", pattern), Here());
31 }
32
33 debugs(28, 2, *this);
34}
35
36RegexPattern::~RegexPattern()
37{
38 regfree(&regex);
39}
40
41void
42RegexPattern::print(std::ostream &os, const RegexPattern * const previous) const
43{
44 // report context-dependent explicit options and delimiters
45 if (!previous) {
46 // do not report default settings
47 if (!caseSensitive())
48 os << "-i ";
49 } else {
50 os << ' '; // separate us from the previous value
51
52 // do not report same-as-previous (i.e. inherited) settings
53 if (previous->flags != flags)
54 os << (caseSensitive() ? "+i " : "-i ");
55 }
56
57 os << pattern;
58}
59