// File: /workspace/github_c_makefile_star2_O0/theovosse[P]llgen/regexp.c
// Function: MatchNFA
ESet MatchNFA(RegExp regExp, char *line) {
	ESet stateSet;
	ESet sPtr;
	ESet *tail;
	Transition tr;
	ESet oldStateSet;
	ESet answers = NULL;
	int currChar;

	stateSet = AddElement(regExp, NULL);
	/* Take eTransitions */
	lastVisit++;
	regExp->lastVisit = lastVisit;
	for (sPtr = stateSet, tail = &(stateSet->next); sPtr != NULL; sPtr = sPtr->next) {
		for (tr = ((RegExp) (sPtr->element))->eTransitions; tr != NULL; tr = tr->next) {
			if (tr->destination->lastVisit != lastVisit) {
				*tail = AddElement(tr->destination, NULL);
				tr->destination->lastVisit = lastVisit;
				tail = &((*tail)->next);
			}
		}
	}
	for (currChar = (int) *line++ & 0xFF; currChar != '\0' && stateSet != NULL; currChar = *line++) {
		lastVisit++;
		tail = NULL;
		/* Take transitions */
		oldStateSet = stateSet;
		stateSet = NULL;
		for (sPtr = oldStateSet; sPtr != NULL; sPtr = sPtr->next) {
			for (tr = ((RegExp) (sPtr->element))->transitions; tr != NULL; tr = tr->next) {
				if (tr->transitionChar == currChar) {
					stateSet = AddElement(tr->destination, stateSet);
					tr->destination->lastVisit = lastVisit;
					if (tail == NULL) {
						tail = &(stateSet->next);
					}
				}
			}
		}
		RemoveSet(oldStateSet);
		/* Take eTransitions */
		for (sPtr = stateSet; sPtr != NULL; sPtr = sPtr->next) {
			for (tr = ((RegExp) (sPtr->element))->eTransitions; tr != NULL; tr = tr->next) {
				if (tr->destination->lastVisit != lastVisit) {
					*tail = AddElement(tr->destination, NULL);
					tr->destination->lastVisit = lastVisit;
					tail = &((*tail)->next);
				}
			}
		}
	}
	for (sPtr = stateSet; sPtr != NULL; sPtr = sPtr->next) {
		if (((RegExp) (sPtr->element))->info != NULL) {
			((ESet) (((RegExp) sPtr->element)->info))->next = answers;
			answers = (ESet) (((RegExp) (sPtr->element))->info);
		}
	}
	RemoveSet(stateSet);
	return (answers);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x8(%rbp), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x11cc0
movq %rax, -0x18(%rbp)
movq 0x10b58(%rip), %rax     # 0x22f48
addq $0x1, %rax
movq %rax, 0x10b4d(%rip)     # 0x22f48
movq 0x10b46(%rip), %rcx     # 0x22f48
movq -0x8(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x18(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x124b4
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x124a1
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x20(%rax), %rax
cmpq 0x10af6(%rip), %rax     # 0x22f48
je 0x12491
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x11cc0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq 0x10ad2(%rip), %rcx     # 0x22f48
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
jmp 0x12493
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x12438
jmp 0x124a3
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x1241e
movq -0x10(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x10(%rbp)
movsbl (%rax), %eax
andl $0xff, %eax
movl %eax, -0x44(%rbp)
xorl %eax, %eax
cmpl $0x0, -0x44(%rbp)
movb %al, -0x45(%rbp)
je 0x124e4
cmpq $0x0, -0x18(%rbp)
setne %al
movb %al, -0x45(%rbp)
movb -0x45(%rbp), %al
testb $0x1, %al
jne 0x124f0
jmp 0x12670
movq 0x10a51(%rip), %rax     # 0x22f48
addq $0x1, %rax
movq %rax, 0x10a46(%rip)     # 0x22f48
movq $0x0, -0x28(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x38(%rbp)
movq $0x0, -0x18(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x125ad
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x1259a
movq -0x30(%rbp), %rax
movl (%rax), %eax
cmpl -0x44(%rbp), %eax
jne 0x1258a
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x11cc0
movq %rax, -0x18(%rbp)
movq 0x109df(%rip), %rcx     # 0x22f48
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x20(%rax)
cmpq $0x0, -0x28(%rbp)
jne 0x12588
movq -0x18(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
jmp 0x1258a
jmp 0x1258c
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x1253b
jmp 0x1259c
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x12522
movq -0x38(%rbp), %rdi
callq 0x11d90
movq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x12654
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x12641
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x20(%rax), %rax
cmpq 0x10956(%rip), %rax     # 0x22f48
je 0x12631
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
xorl %eax, %eax
movl %eax, %esi
callq 0x11cc0
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
movq 0x10932(%rip), %rcx     # 0x22f48
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq %rcx, 0x20(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rax
addq $0x8, %rax
movq %rax, -0x28(%rbp)
jmp 0x12633
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x125d8
jmp 0x12643
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x125be
jmp 0x12656
movq -0x10(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x10(%rbp)
movsbl (%rax), %eax
movl %eax, -0x44(%rbp)
jmp 0x124ce
movq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x126bf
movq -0x20(%rbp), %rax
movq (%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0x126af
movq -0x40(%rbp), %rcx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
jmp 0x126b1
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x12678
movq -0x18(%rbp), %rdi
callq 0x11d90
movq -0x40(%rbp), %rax
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)