File: wvregex.cc

package info (click to toggle)
wvstreams 4.4.1-1.1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 8,148 kB
  • ctags: 8,556
  • sloc: cpp: 64,151; ansic: 8,188; sh: 5,994; makefile: 498; perl: 277; tcl: 114
file content (53 lines) | stat: -rw-r--r-- 1,250 bytes parent folder | download | duplicates (10)
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
/*
 * Worldvisions Weaver Software:
 *   Copyright (C) 1997-2004 Net Integration Technologies, Inc.
 * 
 * Implementation of regular expression support though libc
 */
#include "wvregex.h"

WvString WvRegex::__wvre_null_reg;

const int WvRegex::default_cflags = WvRegex::EXTENDED;
const int WvRegex::default_eflags = 0;
    
void WvRegex::seterr(int errcode)
{
    int error_desc_len = ::regerror(errcode, &preg, NULL, 0);
    if (error_desc_len > 0)
    {
        WvString error_desc;
        error_desc.setsize(error_desc_len);
        ::regerror(errcode, &preg, error_desc.edit(), error_desc_len);
        WvErrorBase::seterr_both(errcode, error_desc);
    }
    else WvErrorBase::seterr(errcode);
}

bool WvRegex::set(WvStringParm regex, int cflags)
{
    if (have_preg) ::regfree(&preg);

    int errcode = ::regcomp(&preg, regex, cflags);
    if (errcode)
    {
        seterr(errcode);
        have_preg = false;
    }
    else have_preg = true;
    
    return have_preg;
}

WvRegex::~WvRegex()
{
    if (have_preg) ::regfree(&preg);
}

bool WvRegex::match(WvStringParm string, int eflags,
    	size_t nmatch, regmatch_t pmatch[]) const
{
    if (!have_preg) return false;

    return ::regexec(&preg, string, nmatch, pmatch, eflags) == 0;
}