Subex.c
Click here to get the file
Size
1.9 kB
-
File type
text/plain
File contents
/*ident "@(#)Regex:Subex.c 3.1" */
/******************************************************************************
*
* C++ Standard Components, Release 3.0.
*
* Copyright (c) 1991, 1992 AT&T and Unix System Laboratories, Inc.
* Copyright (c) 1988, 1989, 1990 AT&T. All Rights Reserved.
*
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T and Unix System
* Laboratories, Inc. The copyright notice above does not evidence
* any actual or intended publication of such source code.
*
******************************************************************************/
#include "Regexlib.h"
static const Substrinfo nomatch = {-1, 0};
Subex::Subex()
: base(0), prog(new reprogram) {
}
Subex::~Subex() {
delete prog;
}
const char *
Subex::the_target() const {
return base;
}
Substrinfo
Subex::dosubex(unsigned int i, reprogram *prog, const char *base) {
assert(prog);
if (i > Regex::max_num_subexes)
return nomatch;
// reexec only clears out prog->match[0] if no match
if (prog->match[0].sp == 0)
return nomatch;
const char *start = prog->match[i].sp;
if (start == 0)
return nomatch;
Substrinfo ss;
ss.i = start - base;
ss.len = prog->match[i].ep - start;
assert((void*)ss);
return ss;
}
// returns subexpression information for the match
//
Substrinfo
Subex::operator()(unsigned int i, String &the_substr) const {
Substrinfo m = (*this)(i);
if (m)
the_substr.assign(base + m.i, m.len);
return m;
}
Substrinfo
Subex::operator()(unsigned int i) const {
if (base == 0) {
return nomatch;
}
return dosubex(i, prog, base);
}
Substrinfo
Regex::subex(unsigned int i) const {
if (prog == 0) {
return nomatch;
}
return Subex::dosubex(i, prog, subexbase);
}
// returns subexpression information for the pattern
//
Substrinfo
Regex::subex(unsigned int i, String &the_subex) const {
Substrinfo m = subex(i);
if (m)
the_subex.assign(subexbase + m.i, m.len);
return m;
}