
/* This is used for COMPILING sregexp.library, it should not be included
  if you just USE the library.	See sregexpbase.h */

#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <libraries/dosextens.h>
#include "sregexpbase.h"

#define TRUE	1
#define FALSE	0


#define MEM_ERROR	ERROR_NO_FREE_STORE	/* report no mem */
#define ILLEGAL_ERR	ERROR_INVALID_COMPONENT_NAME   /* bad sregexp */


/* some handy fingersaving macros. */
#define realen(a)       (((a)->sre_Flag&(SRF_REPEAT|SRF_NOT))?0:(a)->sre_MinLen)
#define isfixed(s)      (((s)->sre_Flag&(SRF_REPEAT|SRF_NOT|SRF_FIXLEN))==SRF_FIXLEN)
#define matchset(s,c)   ((s)->sre_Data.setchar[(c)/8] & 1 << (c)%8)

#ifdef	__MEMCHECK__

#define getmem(a)       checkmem(a,__BASE_FILE__,__LINE__)
#define freemem(p,s)    freecheck(p,s,__BASE_FILE__,__LINE__)

extern void *checkmem(int, char *, int);
extern void freecheck(void *, int, char *, int);

#else

#define getmem(a)       AllocMem(a,0)
#define freemem(p,s)    FreeMem(p,s)

#endif


static struct SregExp *     parsesub(char **, char);
static struct SregExp *     makesum(struct SregList *, int);
static struct SregExp *     makeor(struct SregList *, int);
static struct SregExp *     parseone(char **, char);
static char		    onechar(char **, char);
static struct SregExp *     makenull(void);
static char *		    makeset(char **);
static int		    matchsum(struct SregExp *[], int, char *, int, int);
static void		    report(int);
static struct SpathNode *   makespathnode(BPTR, char *, struct SregList *);
static void		    freespathnode(struct SpathNode *);
static struct SregList *    parsepath(char *);

extern struct SregExp *     parsesregexp(char *);
extern void		    freesregexp(struct SregExp *);
extern int		    matchsregexp(char *, struct SregExp *, int);
extern int		    matchnsregexp(char *, struct SregExp *, int, int);
extern int		    iswild(char *);
extern struct SpathInfo *   anchorpath(char *, char *);
extern int		    nextfile(struct SpathInfo *, char *, int, int);
extern int		    buildpath(struct SpathInfo *, char *, int);
extern void		    freespathinfo(struct SpathInfo *);

