summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htlib/HtRegex.cc
blob: a0f7403866978252e8e419ce48fdbdc3ecd6028f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// HtRegex.cc
//
// HtRegex: A simple C++ wrapper class for the system regex routines.
//
// Part of the ht://Dig package   <http://www.htdig.org/>
// Copyright (c) 1999-2004 The ht://Dig Group
// For copyright details, see the file COPYING in your distribution
// or the GNU Library General Public License (LGPL) version 2 or later 
// <http://www.gnu.org/copyleft/lgpl.html>
//
// $Id: HtRegex.cc,v 1.13 2004/05/28 13:15:21 lha Exp $
//

#ifdef HAVE_CONFIG_H
#include "htconfig.h"
#endif /* HAVE_CONFIG_H */

#include "HtRegex.h"
#include <locale.h>


HtRegex::HtRegex() : compiled(0) { }

HtRegex::HtRegex(const char *str, int case_sensitive) : compiled(0)
{
        set(str, case_sensitive);
}

HtRegex::~HtRegex()
{
	if (compiled != 0) regfree(&re);
	compiled = 0;
}

const String &HtRegex::lastError()
{
	return lastErrorMessage;
}

int
HtRegex::set(const char * str, int case_sensitive)
{
  if (compiled != 0) regfree(&re);

  int err;
  compiled = 0;
  if (str == NULL) return 0;
  if (strlen(str) <= 0) return 0;
  if (err = regcomp(&re, str, case_sensitive ? REG_EXTENDED : (REG_EXTENDED|REG_ICASE)), err == 0)
    {
      compiled = 1;
    }
  else
    {
      size_t len = regerror(err, &re, 0, 0);
      char *buf = new char[len];
      regerror(err, &re, buf, len);
      lastErrorMessage = buf;
      delete buf;
    }
  return compiled;
}

int
HtRegex::setEscaped(StringList &list, int case_sensitive)
{
    String *str;
    String transformedLimits;
    list.Start_Get();
    while ((str = (String *) list.Get_Next()))
      {
	if (str->indexOf('[') == 0 && str->lastIndexOf(']') == str->length()-1)
	  {
	    transformedLimits << str->sub(1,str->length()-2).get();
	  }
	else 	// Backquote any regex special characters
	  {
	    for (int pos = 0; pos < str->length(); pos++)
	      { 
		if (strchr("^.[$()|*+?{\\", str->Nth(pos)))
		  transformedLimits << '\\';
		transformedLimits << str->Nth(pos);
	      }
	  }
	transformedLimits << "|";
      }
    transformedLimits.chop(1);

    return set(transformedLimits, case_sensitive);
}

int
HtRegex::match(const char * str, int nullpattern, int nullstr)
{
	int	rval;
	
	if (compiled == 0) return(nullpattern);
	if (str == NULL) return(nullstr);
	if (strlen(str) <= 0) return(nullstr);
	rval = regexec(&re, str, (size_t) 0, NULL, 0);
	if (rval == 0) return(1);
	else return(0);
}