17db96d56Sopenharmony_ci/*
27db96d56Sopenharmony_ci * Secret Labs' Regular Expression Engine
37db96d56Sopenharmony_ci *
47db96d56Sopenharmony_ci * regular expression matching engine
57db96d56Sopenharmony_ci *
67db96d56Sopenharmony_ci * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.
77db96d56Sopenharmony_ci *
87db96d56Sopenharmony_ci * See the sre.c file for information on usage and redistribution.
97db96d56Sopenharmony_ci */
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci#ifndef SRE_INCLUDED
127db96d56Sopenharmony_ci#define SRE_INCLUDED
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci#include "sre_constants.h"
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci/* size of a code word (must be unsigned short or larger, and
177db96d56Sopenharmony_ci   large enough to hold a UCS4 character) */
187db96d56Sopenharmony_ci#define SRE_CODE Py_UCS4
197db96d56Sopenharmony_ci#if SIZEOF_SIZE_T > 4
207db96d56Sopenharmony_ci# define SRE_MAXREPEAT (~(SRE_CODE)0)
217db96d56Sopenharmony_ci# define SRE_MAXGROUPS ((SRE_CODE)INT32_MAX / 2)
227db96d56Sopenharmony_ci#else
237db96d56Sopenharmony_ci# define SRE_MAXREPEAT ((SRE_CODE)PY_SSIZE_T_MAX)
247db96d56Sopenharmony_ci# define SRE_MAXGROUPS ((SRE_CODE)PY_SSIZE_T_MAX / SIZEOF_VOID_P / 2)
257db96d56Sopenharmony_ci#endif
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_citypedef struct {
287db96d56Sopenharmony_ci    PyObject_VAR_HEAD
297db96d56Sopenharmony_ci    Py_ssize_t groups; /* must be first! */
307db96d56Sopenharmony_ci    PyObject* groupindex; /* dict */
317db96d56Sopenharmony_ci    PyObject* indexgroup; /* tuple */
327db96d56Sopenharmony_ci    /* compatibility */
337db96d56Sopenharmony_ci    PyObject* pattern; /* pattern source (or None) */
347db96d56Sopenharmony_ci    int flags; /* flags used when compiling pattern source */
357db96d56Sopenharmony_ci    PyObject *weakreflist; /* List of weak references */
367db96d56Sopenharmony_ci    int isbytes; /* pattern type (1 - bytes, 0 - string, -1 - None) */
377db96d56Sopenharmony_ci    /* pattern code */
387db96d56Sopenharmony_ci    Py_ssize_t codesize;
397db96d56Sopenharmony_ci    SRE_CODE code[1];
407db96d56Sopenharmony_ci} PatternObject;
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci#define PatternObject_GetCode(o) (((PatternObject*)(o))->code)
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_citypedef struct {
457db96d56Sopenharmony_ci    PyObject_VAR_HEAD
467db96d56Sopenharmony_ci    PyObject* string; /* link to the target string (must be first) */
477db96d56Sopenharmony_ci    PyObject* regs; /* cached list of matching spans */
487db96d56Sopenharmony_ci    PatternObject* pattern; /* link to the regex (pattern) object */
497db96d56Sopenharmony_ci    Py_ssize_t pos, endpos; /* current target slice */
507db96d56Sopenharmony_ci    Py_ssize_t lastindex; /* last index marker seen by the engine (-1 if none) */
517db96d56Sopenharmony_ci    Py_ssize_t groups; /* number of groups (start/end marks) */
527db96d56Sopenharmony_ci    Py_ssize_t mark[1];
537db96d56Sopenharmony_ci} MatchObject;
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_citypedef struct SRE_REPEAT_T {
567db96d56Sopenharmony_ci    Py_ssize_t count;
577db96d56Sopenharmony_ci    const SRE_CODE* pattern; /* points to REPEAT operator arguments */
587db96d56Sopenharmony_ci    const void* last_ptr; /* helper to check for infinite loops */
597db96d56Sopenharmony_ci    struct SRE_REPEAT_T *prev; /* points to previous repeat context */
607db96d56Sopenharmony_ci} SRE_REPEAT;
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_citypedef struct {
637db96d56Sopenharmony_ci    /* string pointers */
647db96d56Sopenharmony_ci    const void* ptr; /* current position (also end of current slice) */
657db96d56Sopenharmony_ci    const void* beginning; /* start of original string */
667db96d56Sopenharmony_ci    const void* start; /* start of current slice */
677db96d56Sopenharmony_ci    const void* end; /* end of original string */
687db96d56Sopenharmony_ci    /* attributes for the match object */
697db96d56Sopenharmony_ci    PyObject* string;
707db96d56Sopenharmony_ci    Py_buffer buffer;
717db96d56Sopenharmony_ci    Py_ssize_t pos, endpos;
727db96d56Sopenharmony_ci    int isbytes;
737db96d56Sopenharmony_ci    int charsize; /* character size */
747db96d56Sopenharmony_ci    int match_all;
757db96d56Sopenharmony_ci    int must_advance;
767db96d56Sopenharmony_ci    /* marks */
777db96d56Sopenharmony_ci    int lastmark;
787db96d56Sopenharmony_ci    int lastindex;
797db96d56Sopenharmony_ci    const void** mark;
807db96d56Sopenharmony_ci    /* dynamically allocated stuff */
817db96d56Sopenharmony_ci    char* data_stack;
827db96d56Sopenharmony_ci    size_t data_stack_size;
837db96d56Sopenharmony_ci    size_t data_stack_base;
847db96d56Sopenharmony_ci    /* current repeat context */
857db96d56Sopenharmony_ci    SRE_REPEAT *repeat;
867db96d56Sopenharmony_ci} SRE_STATE;
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_citypedef struct {
897db96d56Sopenharmony_ci    PyObject_HEAD
907db96d56Sopenharmony_ci    PyObject* pattern;
917db96d56Sopenharmony_ci    SRE_STATE state;
927db96d56Sopenharmony_ci    int executing;
937db96d56Sopenharmony_ci} ScannerObject;
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci#endif
96