]> git.ipfire.org Git - thirdparty/squid.git/blob - src/base/RegexPattern.cc
e56b76faf5156fc7de7cbbbe3adb310acb95fe0e
[thirdparty/squid.git] / src / base / RegexPattern.cc
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
18 RegexPattern::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
36 RegexPattern::~RegexPattern()
37 {
38 regfree(&regex);
39 }
40
41 void
42 RegexPattern::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