/*
 * Copyright (c) 2002 by The XFree86 Project, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 *
 * Except as contained in this notice, the name of the XFree86 Project shall
 * not be used in advertising or otherwise to promote the sale, use or other
 * dealings in this Software without prior written authorization from the
 * XFree86 Project.
 *
 * Author: Paulo César Pereira de Andrade
 */

/* $XFree86: xc/programs/xedit/lisp/re/re.h,v 1.2 2002/09/23 01:25:41 paulo Exp $ */

#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#ifndef _re_h
#define _re_h

/*
 * Defines
 */

	/* Compile flags options */
#define REG_BASIC		0000	/* Not used */
#define REG_EXTENDED		0001	/* Not used, only extended supported */

#define RE_ICASE		0002
#define RE_NOSUB		0004
#define RE_NEWLINE		0010
#define RE_NOSPEC		0020
#define RE_PEND			0040
#define RE_DUMP			0200



	/* Execute flag options */
#define RE_NOTBOL		1
#define RE_NOTEOL		2
#define RE_STARTEND		4
#define RE_TRACE		00400	/* Not used/supported */
#define RE_LARGE		01000	/* Not used/supported */
#define RE_BACKR		02000	/* Not used/supported */

	/* Value returned by reexec when match fails */
#define RE_NOMATCH		1
	/* Compile error values */
#define RE_BADPAT		2
#define RE_ECOLLATE		3
#define RE_ECTYPE		4
#define RE_EESCAPE		5
#define RE_ESUBREG		6
#define RE_EBRACK		7
#define RE_EPAREN		8
#define RE_EBRACE		9
#define RE_EBADBR		10
#define RE_ERANGE		11
#define RE_ESPACE		12
#define RE_BADRPT		13
#define RE_EMPTY		14
#define RE_ASSERT		15
#define RE_INVARG		16
#define RE_ATOI			255	/* Not used/supported */
#define RE_ITOA			0400	/* Not used/supported */


/*
 * Types
 */

/* (re)gular expression (mat)ch result */
typedef struct _re_mat {
    long rm_so;
    long rm_eo;
} re_mat;

/* (re)gular expression (cod)e */
typedef struct _re_cod {
    unsigned char *cod;
    int re_nsub;		/* Public member */
    const char *re_endp;	/* Support for RE_PEND */
} re_cod;


/*
 * Prototypes
 */
	/* compile the given pattern string
	 * returns 0 on success, error code otherwise */
int recomp(re_cod *preg, const char *pattern, int flags);

	/* execute the compiled pattern on the string.
	 * returns 0 if matched, RE_NOMATCH if failed, error code otherwise */
int reexec(const re_cod *preg, const char *string,
	   int nmat, re_mat pmat[], int flags);

	/* formats an error message for the given code in ebuffer */
int reerror(int ecode, const re_cod *preg, char *ebuffer, int ebuffer_size);

	/* frees the given parameter */
void refree(re_cod *preg);


#endif /* _re_h */
