libzypp  11.13.5
Regex.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <cstdio>
13 #include <cstdarg>
14 
15 #include <iostream>
16 
17 #include "zypp/base/Regex.h"
18 
19 using namespace zypp;
20 using namespace zypp::str;
21 
22 regex::regex()
23  : m_flags(match_extended)
24  , m_valid(false)
25 {
26 
27 }
28 
29 void regex::assign(const std::string& str,int flags)
30 {
31  m_valid = true;
32  m_str = str;
33  m_flags = flags;
34  int err;
35  char errbuff[100];
36  if (!(flags & normal)) {
37  flags |= match_extended;
38  flags &= ~(normal);
39  }
40 
41  if ((err = regcomp(&m_preg, str.c_str(), flags))) {
42  m_valid = false;
43  regerror(err, &m_preg, errbuff, sizeof(errbuff));
44  ZYPP_THROW(regex_error(std::string(errbuff)));
45  }
46 }
47 
48 regex::regex(const std::string& str, int flags)
49 {
50  assign(str, flags);
51 }
52 
53 regex::~regex() throw()
54 {
55  if (m_valid)
56  regfree(&m_preg);
57 }
58 
59 bool zypp::str::regex_match(const char * s, smatch& matches, const regex& regex)
60 {
61  bool r = s && regex.m_valid && !regexec(&regex.m_preg, s, 12, &matches.pmatch[0], 0);
62  if (r)
63  matches.match_str = s;
64  return r;
65 }
66 
67 bool zypp::str::regex_match(const char * s, const regex& regex)
68 {
69  return s && !regexec(&regex.m_preg, s, 0, NULL, 0);
70 }
71 
73 {
74  memset(&pmatch, -1, sizeof(pmatch));
75 }
76 
77 std::string smatch::operator[](unsigned i) const
78 {
79  if ( i < sizeof(pmatch)/sizeof(*pmatch) && pmatch[i].rm_so != -1 )
80  return match_str.substr( pmatch[i].rm_so, pmatch[i].rm_eo-pmatch[i].rm_so );
81 
82  return std::string();
83 }
84 
85 
86 unsigned smatch::size() const
87 {
88  unsigned matches = unsigned(-1);
89  // Get highest (pmatch[i].rm_so != -1). Just looking for the 1st
90  // (pmatch[i].rm_so == -1) is wrong as optional mayches "()?"
91  // may be embeded.
92  for ( unsigned i = 0; i < sizeof(pmatch)/sizeof(*pmatch); ++i )
93  {
94  if ( pmatch[i].rm_so != -1 )
95  matches = i;
96  }
97  return ++matches;
98 }