; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.762 

	TITLE	d:\Source Code\NC lib\regex\pcre_xclass.c
	.686P
	.XMM
	include listing.inc
	.model	flat

INCLUDELIB LIBCMTD
INCLUDELIB OLDNAMES

PUBLIC	__pcre_xclass
; Function compile flags: /Ogtpy
; File d:\source code\nc lib\regex\pcre_xclass.c
;	COMDAT __pcre_xclass
_TEXT	SEGMENT
_c$ = 8							; size = 4
tv192 = 12						; size = 4
_data$ = 12						; size = 4
__pcre_xclass PROC					; COMDAT

; 66   : {

	push	ebx
	push	ebp
	push	esi

; 67   : int t;
; 68   : BOOL negated = (*data & XCL_NOT) != 0;

	mov	esi, DWORD PTR _data$[esp+8]
	mov	bl, BYTE PTR [esi]
	movzx	eax, bl
	push	edi

; 69   : 
; 70   : /* Character values < 256 are matched against a bitmap, if one is present. If
; 71   : not, we still carry on, because there may be ranges that start below 256 in the
; 72   : additional data. */
; 73   : 
; 74   : if (c < 256)

	mov	edi, DWORD PTR _c$[esp+12]
	and	eax, 1
	cmp	edi, 256				; 00000100H
	mov	ebp, eax
	jge	SHORT $LN17@pcre_xclas

; 75   :   {
; 76   :   if ((*data & XCL_MAP) != 0 && (data[1 + c/8] & (1 << (c&7))) != 0)

	test	bl, 2
	je	SHORT $LN17@pcre_xclas
	mov	ecx, edi
	and	ecx, 7
	mov	eax, 1
	shl	eax, cl
	mov	DWORD PTR tv192[esp+12], eax
	mov	eax, edi
	cdq
	and	edx, 7
	add	eax, edx
	sar	eax, 3
	mov	cl, BYTE PTR [eax+esi+1]
	mov	eax, DWORD PTR tv192[esp+12]
	test	al, cl
	je	SHORT $LN17@pcre_xclas
$LN14@pcre_xclas:
	pop	edi

; 77   :     return !negated;   /* char found */

	xor	eax, eax
	pop	esi
	test	ebp, ebp
	pop	ebp
	sete	al
	pop	ebx

; 143  : }

	ret	0
$LN17@pcre_xclas:

; 78   :   }
; 79   : 
; 80   : /* First skip the bit map if present. Then match against the list of Unicode
; 81   : properties or large chars or ranges that end with a large char. We won't ever
; 82   : encounter XCL_PROP or XCL_NOTPROP when UCP support is not compiled. */
; 83   : 
; 84   : if ((*data++ & XCL_MAP) != 0) data += 32;

	and	bl, 2
	add	esi, 1
	test	bl, bl
	je	SHORT $LN13@pcre_xclas
	add	esi, 32					; 00000020H
$LN13@pcre_xclas:

; 85   : 
; 86   : while ((t = *data++) != XCL_END)

	movzx	eax, BYTE PTR [esi]
	test	eax, eax
	je	SHORT $LN16@pcre_xclas
	npad	6
$LL7@pcre_xclas:
	add	esi, 1

; 87   :   {
; 88   :   int x, y;
; 89   :   if (t == XCL_SINGLE)

	cmp	eax, 1
	jne	SHORT $LN5@pcre_xclas

; 90   :     {
; 91   :     GETCHARINC(x, data);

	movzx	eax, BYTE PTR [esi]
	add	esi, 1

; 92   :     if (c == x) return !negated;

	cmp	edi, eax
	je	SHORT $LN14@pcre_xclas

; 93   :     }
; 94   :   else if (t == XCL_RANGE)

	jmp	SHORT $LN1@pcre_xclas
$LN5@pcre_xclas:
	cmp	eax, 2
	jne	SHORT $LN1@pcre_xclas

; 95   :     {
; 96   :     GETCHARINC(x, data);

	movzx	eax, BYTE PTR [esi]

; 97   :     GETCHARINC(y, data);

	movzx	ecx, BYTE PTR [esi+1]
	add	esi, 1
	add	esi, 1

; 98   :     if (c >= x && c <= y) return !negated;

	cmp	edi, eax
	jl	SHORT $LN1@pcre_xclas
	cmp	edi, ecx
	jle	SHORT $LN14@pcre_xclas
$LN1@pcre_xclas:

; 85   : 
; 86   : while ((t = *data++) != XCL_END)

	movzx	eax, BYTE PTR [esi]
	test	eax, eax
	jne	SHORT $LL7@pcre_xclas
$LN16@pcre_xclas:
	pop	edi
	pop	esi

; 99   :     }
; 100  : 
; 101  : #ifdef SUPPORT_UCP
; 102  :   else  /* XCL_PROP & XCL_NOTPROP */
; 103  :     {
; 104  :     int chartype, script;
; 105  :     int category = _pcre_ucp_findprop(c, &chartype, &script);
; 106  : 
; 107  :     switch(*data)
; 108  :       {
; 109  :       case PT_ANY:
; 110  :       if (t == XCL_PROP) return !negated;
; 111  :       break;
; 112  : 
; 113  :       case PT_LAMP:
; 114  :       if ((chartype == ucp_Lu || chartype == ucp_Ll || chartype == ucp_Lt) ==
; 115  :           (t == XCL_PROP)) return !negated;
; 116  :       break;
; 117  : 
; 118  :       case PT_GC:
; 119  :       if ((data[1] == category) == (t == XCL_PROP)) return !negated;
; 120  :       break;
; 121  : 
; 122  :       case PT_PC:
; 123  :       if ((data[1] == chartype) == (t == XCL_PROP)) return !negated;
; 124  :       break;
; 125  : 
; 126  :       case PT_SC:
; 127  :       if ((data[1] == script) == (t == XCL_PROP)) return !negated;
; 128  :       break;
; 129  : 
; 130  :       /* This should never occur, but compilers may mutter if there is no
; 131  :       default. */
; 132  : 
; 133  :       default:
; 134  :       return FALSE;
; 135  :       }
; 136  : 
; 137  :     data += 2;
; 138  :     }
; 139  : #endif  /* SUPPORT_UCP */
; 140  :   }
; 141  : 
; 142  : return negated;   /* char did not match */

	mov	eax, ebp
	pop	ebp
	pop	ebx

; 143  : }

	ret	0
__pcre_xclass ENDP
_TEXT	ENDS
END
