da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * posix regex error message handler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulknerstatic const char id[] = "\n@(#)$Id: regex (AT&T Research) 2009-12-11 $\0\n";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "reglib.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char* reg_error[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ENOSYS */ "not supported",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_SUCCESS */ "success",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_NOMATCH */ "no match",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_BADPAT */ "invalid regular expression",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ECOLLATE */ "invalid collation element",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ECTYPE */ "invalid character class",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EESCAPE */ "trailing \\ in pattern",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ESUBREG */ "invalid \\digit backreference",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EBRACK */ "[...] imbalance",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EPAREN */ "\\(...\\) or (...) imbalance",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EBRACE */ "\\{...\\} or {...} imbalance",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_BADBR */ "invalid {...} digits",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ERANGE */ "invalid [...] range endpoint",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ESPACE */ "out of space",
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner /* REG_BADRPT */ "unary op not preceded by re",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ENULL */ "empty subexpr in pattern",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_ECOUNT */ "re component count overflow",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_BADESC */ "invalid \\char escape",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_VERSIONID*/ &id[10],
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EFLAGS */ "conflicting flags",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_EDELIM */ "invalid or omitted delimiter",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* REG_PANIC */ "unrecoverable internal error",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsize_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinregerror(int code, const regex_t* p, char* buf, size_t size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (code++ == REG_VERSIONID)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (const char*)fmtident(&id[1]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (code >= 0 && code < elementsof(reg_error))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = reg_error[code];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (const char*)"unknown error";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strncpy(buf, s, size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf[size - 1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buf = (char*)s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return strlen(buf) + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * discipline error intercept
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfatal(regdisc_t* disc, int code, const char* pattern)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (disc->re_errorf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pattern)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*disc->re_errorf)(NiL, disc, disc->re_errorlevel, "regular expression: %s: %s", pattern, reg_error[code+1]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*disc->re_errorf)(NiL, disc, disc->re_errorlevel, "regular expression: %s", reg_error[code+1]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return code;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}