regrexec.c revision 3e14f97f673e8a630f076077de35afdd43dc1587
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe/***********************************************************************
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* This software is part of the ast package *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* Copyright (c) 1985-2010 AT&T Intellectual Property *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* and is licensed under the *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* Common Public License, Version 1.0 *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* by AT&T Intellectual Property *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* A copy of the License is available at *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* http://www.opensource.org/licenses/cpl1.0.txt *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* Information and Software Systems Research *
7b1019a6d29ccb7999dc76cba3dde1c627e8e609Jerry Jelinek* AT&T Research *
bd93c05dbd9b8f1e8d2edf48c777bc881f927608Alexander Eremin* Florham Park NJ *
ead9bb4b1be81d7bbf8ed86ee41d6c1e58b069a3Yuri Pankov* Glenn Fowler <gsf@research.att.com> *
c10c16dec587a0662068f6e2991c29ed3a9db943Richard Lowe* David Korn <dgk@research.att.com> *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov* Phong Vo <kpv@research.att.com> *
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov***********************************************************************/
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * posix regex record executor
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * multiple record sized-buffer interface
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov * call regnexec() on records selected by Boyer-Moore
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankovregrexec(const regex_t* p, const char* s, size_t len, size_t nmatch, regmatch_t* match, regflags_t flags, int sep, void* handle, regrecord_t record)
d0054224e0ba320a05d1c27de508dc5224ff99d1Adam Stevko register unsigned char* buf = (unsigned char*)s;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov register unsigned char* beg;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov register unsigned char* l;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov register unsigned char* r;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov register unsigned char* x;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov register int n;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov unsigned char* end;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (!s || !p || !(env = p->env) || (e = env->rex)->type != REX_BM)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov mid = (len < e->re.bm.right) ? 0 : (len - e->re.bm.right);
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (*--l == sep)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if ((r - l) < leftlen)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov if (complete || (env->rex = ((r - l) > 128) ? e : e->next) && !(n = regnexec(p, (char*)l, r - l, nmatch, match, flags)))
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov while (x < l && *x != sep)
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov else if (n = (*record)(handle, (char*)l, r - l))
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov n = (inv && (++r - buf) < len) ? (*record)(handle, (char*)r, (buf + len) - r): 0;
a9478106a12424322498e53cf7cd75bd8a4d6004Yuri Pankov else if (n != REG_NOMATCH)