#
# Secret Labs' Regular Expression Engine
# $Id$
#
# various symbols used by the regular expression engine.
# run this script to update the _sre include files!
#
# Copyright (c) 1998-2000 by Secret Labs AB.  All rights reserved.
#
# This code can only be used for 1.6 alpha testing.  All other use
# require explicit permission from Secret Labs AB.
#
# Portions of this engine have been developed in cooperation with
# CNRI.  Hewlett-Packard provided funding for 1.6 integration and
# other compatibility work.
#

# operators

FAILURE = "failure"
SUCCESS = "success"

ANY = "any"
ASSERT = "assert"
AT = "at"
BRANCH = "branch"
CALL = "call"
CATEGORY = "category"
GROUP = "group"
GROUP_IGNORE = "group_ignore"
IN = "in"
IN_IGNORE = "in_ignore"
JUMP = "jump"
LITERAL = "literal"
LITERAL_IGNORE = "literal_ignore"
MARK = "mark"
MAX_REPEAT = "max_repeat"
MAX_REPEAT_ONE = "max_repeat_one"
MAX_UNTIL = "max_until"
MIN_REPEAT = "min_repeat"
MIN_UNTIL = "min_until"
NEGATE = "negate"
NOT_LITERAL = "not_literal"
NOT_LITERAL_IGNORE = "not_literal_ignore"
RANGE = "range"
REPEAT = "repeat"
SUBPATTERN = "subpattern"

# positions
AT_BEGINNING = "at_beginning"
AT_BOUNDARY = "at_boundary"
AT_NON_BOUNDARY = "at_non_boundary"
AT_END = "at_end"

# categories

CATEGORY_DIGIT = "category_digit"
CATEGORY_NOT_DIGIT = "category_not_digit"
CATEGORY_SPACE = "category_space"
CATEGORY_NOT_SPACE = "category_not_space"
CATEGORY_WORD = "category_word"
CATEGORY_NOT_WORD = "category_not_word"

CODES = [

    # failure=0 success=1 (just because it looks better that way :-)
    FAILURE, SUCCESS,

    ANY,
    ASSERT,
    AT,
    BRANCH,
    CALL,
    CATEGORY,
    GROUP, GROUP_IGNORE,
    IN, IN_IGNORE,
    JUMP,
    LITERAL, LITERAL_IGNORE,
    MARK,
    MAX_REPEAT, MAX_UNTIL,
    MAX_REPEAT_ONE,
    MIN_REPEAT, MIN_UNTIL,
    NOT_LITERAL, NOT_LITERAL_IGNORE,
    NEGATE,
    RANGE,
    REPEAT

]

# convert to dictionary
c = {}
i = 0
for code in CODES:
    c[code] = i
    i = i + 1
CODES = c

# replacement operations for "ignore case" mode
MAP_IGNORE = {
    GROUP: GROUP_IGNORE,
    IN: IN_IGNORE,
    LITERAL: LITERAL_IGNORE,
    NOT_LITERAL: NOT_LITERAL_IGNORE
}

POSITIONS = {
    AT_BEGINNING: ord("a"),
    AT_BOUNDARY: ord("b"),
    AT_NON_BOUNDARY: ord("B"),
    AT_END: ord("z"),
}

CATEGORIES = {
    CATEGORY_DIGIT: ord("d"),
    CATEGORY_NOT_DIGIT: ord("D"),
    CATEGORY_SPACE: ord("s"),
    CATEGORY_NOT_SPACE: ord("S"),
    CATEGORY_WORD: ord("w"),
    CATEGORY_NOT_WORD: ord("W"),
}

if __name__ == "__main__":
    import string
    items = CODES.items()
    items.sort(lambda a, b: cmp(a[1], b[1]))
    f = open("sre_constants.h", "w")
    f.write("/* generated by sre_constants.py */\n")
    for k, v in items:
	f.write("#define SRE_OP_" + string.upper(k) + " " + str(v) + "\n")
    f.close()
    print "done"
