blob: 722f890499052ff984a3e7d5dbde6c34e8f63c6a [file] [log] [blame]
Guido van Rossumb700df92000-03-31 14:59:30 +00001/*
2 * Secret Labs' Regular Expression Engine
3 * $Id$
4 *
5 * simple regular expression matching engine
6 *
7 * Copyright (c) 1997-2000 by Secret Labs AB. All rights reserved.
8 *
9 * See the _sre.c file for information on usage and redistribution.
10 */
11
12#ifndef SRE_INCLUDED
13#define SRE_INCLUDED
14
15#include "sre_constants.h"
16
Fredrik Lundh102f3ad2000-06-29 08:55:54 +000017/* size of a code word (must be unsigned short or larger) */
18#define SRE_CODE unsigned short
19
Guido van Rossumb700df92000-03-31 14:59:30 +000020typedef struct {
21 PyObject_HEAD
22 PyObject* code; /* link to the code string object */
Guido van Rossumb700df92000-03-31 14:59:30 +000023 int groups;
24 PyObject* groupindex;
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000025 /* compatibility */
26 PyObject* pattern; /* pattern source (or None) */
27 int flags; /* flags used when compiling pattern source */
Guido van Rossumb700df92000-03-31 14:59:30 +000028} PatternObject;
29
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000030#define PatternObject_GetCode(o)\
31 ((void*) PyString_AS_STRING(((PatternObject*)(o))->code))
Guido van Rossumb700df92000-03-31 14:59:30 +000032
33typedef struct {
34 PyObject_HEAD
35 PyObject* string; /* link to the target string */
36 PatternObject* pattern; /* link to the regex (pattern) object */
37 int groups; /* number of groups (start/end marks) */
38 int mark[2];
39} MatchObject;
40
Fredrik Lundh102f3ad2000-06-29 08:55:54 +000041typedef unsigned int (*SRE_TOLOWER_HOOK)(unsigned int ch);
42
43typedef struct {
44 /* stack elements */
45 SRE_CODE* pattern;
46 void* ptr;
47} SRE_STACK;
48
Fredrik Lundhbe2211e2000-06-29 16:57:40 +000049/* FIXME: <fl> shouldn't be a constant, really... */
50#define SRE_MARK_SIZE 200
51
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000052typedef struct {
53 /* string pointers */
54 void* ptr; /* current position (also end of current slice) */
55 void* beginning; /* start of original string */
56 void* start; /* start of current slice */
57 void* end; /* end of original string */
58 /* character size */
59 int charsize;
60 /* registers */
Fredrik Lundh102f3ad2000-06-29 08:55:54 +000061 int lastmark;
Fredrik Lundhbe2211e2000-06-29 16:57:40 +000062 void* mark[SRE_MARK_SIZE];
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000063 /* backtracking stack */
Fredrik Lundh102f3ad2000-06-29 08:55:54 +000064 SRE_STACK* stack;
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000065 int stacksize;
66 int stackbase;
Fredrik Lundh102f3ad2000-06-29 08:55:54 +000067 /* hooks */
Fredrik Lundhb389df32000-06-29 12:48:37 +000068 SRE_TOLOWER_HOOK lower;
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000069} SRE_STATE;
Guido van Rossumb700df92000-03-31 14:59:30 +000070
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000071typedef struct {
Fredrik Lundhbe2211e2000-06-29 16:57:40 +000072 /* scanner (internal helper object) */
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000073 PyObject_HEAD
74 PyObject* pattern;
75 PyObject* string;
76 SRE_STATE state;
Fredrik Lundhbe2211e2000-06-29 16:57:40 +000077} ScannerObject;
Jeremy Hyltonb1aa1952000-06-01 17:39:12 +000078
79#endif