NeoMutt  2020-11-20
Teaching an old dog new tricks
regex2.h File Reference

Type representing a regular expression. More...

#include "mutt/regex3.h"
+ Include dependency graph for regex2.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.


void regex_free (struct Regex **regex)
 Free a Regex object. More...
struct Regexregex_new (const char *str, int flags, struct Buffer *err)
 Create an Regex from a string. More...

Detailed Description

Type representing a regular expression.

  • Richard Russon

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see

Definition in file regex2.h.

Function Documentation

◆ regex_free()

void regex_free ( struct Regex **  r)

Free a Regex object.

[out]rRegex to free

Definition at line 48 of file regex.c.

49 {
50  if (!r || !*r)
51  return;
53  FREE(&(*r)->pattern);
54  if ((*r)->regex)
55  regfree((*r)->regex);
56  FREE(&(*r)->regex);
57  FREE(r);
58 }
#define FREE(x)
Definition: memory.h:40
+ Here is the caller graph for this function:

◆ regex_new()

struct Regex* regex_new ( const char *  str,
int  flags,
struct Buffer err 

Create an Regex from a string.

strRegular expression
flagsType flags, e.g. DT_REGEX_MATCH_CASE
errBuffer for error messages
Return values
ptrNew Regex object

Definition at line 80 of file regex.c.

81 {
82  if (!str)
83  return NULL;
85  int rflags = 0;
86  struct Regex *reg = mutt_mem_calloc(1, sizeof(struct Regex));
88  reg->regex = mutt_mem_calloc(1, sizeof(regex_t));
89  reg->pattern = mutt_str_dup(str);
91  /* Should we use smart case matching? */
92  if (((flags & DT_REGEX_MATCH_CASE) == 0) && mutt_mb_is_lower(str))
93  rflags |= REG_ICASE;
95  if ((flags & DT_REGEX_NOSUB))
96  rflags |= REG_NOSUB;
98  /* Is a prefix of '!' allowed? */
99  if (((flags & DT_REGEX_ALLOW_NOT) != 0) && (str[0] == '!'))
100  {
101  reg->pat_not = true;
102  str++;
103  }
105  int rc = REG_COMP(reg->regex, str, rflags);
106  if (rc != 0)
107  {
108  if (err)
109  regerror(rc, reg->regex, err->data, err->dsize);
110  regex_free(&reg);
111  return NULL;
112  }
114  return reg;
115 }
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
Definition: memory.c:50
regex_t * regex
compiled expression
Definition: regex3.h:91
bool pat_not
do not match
Definition: regex3.h:92
Case-sensitive matching.
Definition: regex3.h:35
char * mutt_str_dup(const char *str)
Copy a string, safely.
Definition: string.c:370
#define REG_COMP(preg, regex, cflags)
Compile a regular expression.
Definition: regex3.h:53
size_t dsize
Length of data.
Definition: buffer.h:37
void regex_free(struct Regex **r)
Free a Regex object.
Definition: regex.c:48
Do not report what was matched (REG_NOSUB)
Definition: regex3.h:37
char * data
Pointer to data.
Definition: buffer.h:35
Regex can begin with '!'.
Definition: regex3.h:36
Cached regular expression.
Definition: regex3.h:88
char * pattern
printable version
Definition: regex3.h:90
bool mutt_mb_is_lower(const char *s)
Does a multi-byte string contain only lowercase characters?
Definition: mbyte.c:358
+ Here is the call graph for this function:
+ Here is the caller graph for this function: