RegexPattern.cc
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2022 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 
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 
size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
Definition: GnuRegex.c:4252
int regcomp(regex_t *preg, const char *pattern, int cflags)
Definition: GnuRegex.c:4124
void regfree(regex_t *preg)
Definition: GnuRegex.c:4287
#define Here()
source code location of the caller
Definition: Here.h:15
static std::ostream & Extra(std::ostream &os)
prefixes each grouped debugs() line after the first one in the group
Definition: Stream.h:117
bool caseSensitive() const
whether the regex differentiates letter case
Definition: RegexPattern.h:32
SBuf pattern
a regular expression in the text form, suitable for regcomp(3)
Definition: RegexPattern.h:46
const int flags
bitmask of REG_* flags for regcomp(3)
Definition: RegexPattern.h:49
void print(std::ostream &os, const RegexPattern *previous=nullptr) const
Definition: RegexPattern.cc:42
regex_t regex
a "compiled pattern buffer" filled by regcomp(3) for regexec(3)
Definition: RegexPattern.h:52
RegexPattern()=delete
Definition: SBuf.h:94
const char * c_str()
Definition: SBuf.cc:516
an std::runtime_error with thrower location info
Definition: TextException.h:21
#define debugs(SECTION, LEVEL, CONTENT)
Definition: Stream.h:196
SBuf ToSBuf(Args &&... args)
slowly stream-prints all arguments into a freshly allocated SBuf
Definition: Stream.h:63

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors