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

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

INCLUDELIB LIBCMTD
INCLUDELIB OLDNAMES

PUBLIC	_pcre_fullinfo
EXTRN	__pcre_default_tables:BYTE
EXTRN	__pcre_try_flipped:PROC
; Function compile flags: /Ogtpy
; File d:\source code\nc lib\regex\pcre_fullinfo.c
;	COMDAT _pcre_fullinfo
_TEXT	SEGMENT
_internal_study$ = -80					; size = 40
_internal_re$ = -40					; size = 40
_argument_re$ = 8					; size = 4
_extra_data$ = 12					; size = 4
_what$ = 16						; size = 4
_where$ = 20						; size = 4
_pcre_fullinfo PROC					; COMDAT

; 72   : real_pcre internal_re;
; 73   : pcre_study_data internal_study;
; 74   : const real_pcre *re = (const real_pcre *)argument_re;

	mov	eax, DWORD PTR _argument_re$[esp-4]
	sub	esp, 80					; 00000050H
	push	esi

; 75   : const pcre_study_data *study = NULL;

	xor	esi, esi

; 76   : 
; 77   : if (re == NULL || where == NULL) return PCRE_ERROR_NULL;

	test	eax, eax
	push	edi
	je	$LN23@pcre_fulli
	mov	edi, DWORD PTR _where$[esp+84]
	test	edi, edi
	je	$LN23@pcre_fulli
	push	ebx

; 78   : 
; 79   : if (extra_data != NULL && (extra_data->flags & PCRE_EXTRA_STUDY_DATA) != 0)

	mov	ebx, DWORD PTR _extra_data$[esp+88]
	test	ebx, ebx
	je	SHORT $LN22@pcre_fulli
	test	BYTE PTR [ebx], 1
	je	SHORT $LN22@pcre_fulli

; 80   :   study = (const pcre_study_data *)extra_data->study_data;

	mov	esi, DWORD PTR [ebx+4]
$LN22@pcre_fulli:

; 81   : 
; 82   : if (re->magic_number != MAGIC_NUMBER)

	cmp	DWORD PTR [eax], 1346589253		; 50435245H
	je	SHORT $LN19@pcre_fulli

; 83   :   {
; 84   :   re = _pcre_try_flipped(re, &internal_re, study, &internal_study);

	lea	ecx, DWORD PTR _internal_study$[esp+92]
	push	ecx
	push	esi
	lea	edx, DWORD PTR _internal_re$[esp+100]
	push	edx
	push	eax
	call	__pcre_try_flipped
	add	esp, 16					; 00000010H

; 85   :   if (re == NULL) return PCRE_ERROR_BADMAGIC;

	test	eax, eax
	jne	SHORT $LN20@pcre_fulli
	pop	ebx
	pop	edi
	mov	eax, -4					; fffffffcH
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN20@pcre_fulli:

; 86   :   if (study != NULL) study = &internal_study;

	test	esi, esi
	je	SHORT $LN19@pcre_fulli
	lea	esi, DWORD PTR _internal_study$[esp+92]
$LN19@pcre_fulli:

; 87   :   }
; 88   : 
; 89   : switch (what)

	mov	ecx, DWORD PTR _what$[esp+88]
	cmp	ecx, 14					; 0000000eH
	ja	$LN1@pcre_fulli
	jmp	DWORD PTR $LN37@pcre_fulli[ecx*4]
$LN16@pcre_fulli:

; 90   :   {
; 91   :   case PCRE_INFO_OPTIONS:
; 92   :   *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS;

	mov	eax, DWORD PTR [eax+8]
	and	eax, 33323647				; 01fc7a7fH
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN15@pcre_fulli:

; 93   :   break;
; 94   : 
; 95   :   case PCRE_INFO_SIZE:
; 96   :   *((size_t *)where) = re->size;

	mov	ecx, DWORD PTR [eax+4]
	pop	ebx

; 153  :   break;
; 154  : 
; 155  :   case PCRE_INFO_HASCRORLF:
; 156  :   *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;

	mov	DWORD PTR [edi], ecx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN14@pcre_fulli:

; 97   :   break;
; 98   : 
; 99   :   case PCRE_INFO_STUDYSIZE:
; 100  :   *((size_t *)where) = (study == NULL)? 0 : study->size;

	test	esi, esi
	jne	SHORT $LN27@pcre_fulli
	pop	ebx
	mov	DWORD PTR [edi], esi
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN27@pcre_fulli:

; 97   :   break;
; 98   : 
; 99   :   case PCRE_INFO_STUDYSIZE:
; 100  :   *((size_t *)where) = (study == NULL)? 0 : study->size;

	mov	esi, DWORD PTR [esi]
	pop	ebx
	mov	DWORD PTR [edi], esi
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN13@pcre_fulli:

; 101  :   break;
; 102  : 
; 103  :   case PCRE_INFO_CAPTURECOUNT:
; 104  :   *((int *)where) = re->top_bracket;

	movzx	edx, WORD PTR [eax+16]
	pop	ebx
	mov	DWORD PTR [edi], edx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN12@pcre_fulli:

; 105  :   break;
; 106  : 
; 107  :   case PCRE_INFO_BACKREFMAX:
; 108  :   *((int *)where) = re->top_backref;

	movzx	eax, WORD PTR [eax+18]
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN11@pcre_fulli:

; 109  :   break;
; 110  : 
; 111  :   case PCRE_INFO_FIRSTBYTE:
; 112  :   *((int *)where) =
; 113  :     ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte :
; 114  :     ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;

	movzx	ecx, WORD PTR [eax+12]
	test	cl, 2
	je	SHORT $LN29@pcre_fulli
	movzx	eax, WORD PTR [eax+20]
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN29@pcre_fulli:

; 109  :   break;
; 110  : 
; 111  :   case PCRE_INFO_FIRSTBYTE:
; 112  :   *((int *)where) =
; 113  :     ((re->flags & PCRE_FIRSTSET) != 0)? re->first_byte :
; 114  :     ((re->flags & PCRE_STARTLINE) != 0)? -1 : -2;

	movzx	eax, cx
	shr	eax, 3
	or	eax, -2					; fffffffeH
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN10@pcre_fulli:

; 115  :   break;
; 116  : 
; 117  :   /* Make sure we pass back the pointer to the bit vector in the external
; 118  :   block, not the internal copy (with flipped integer fields). */
; 119  : 
; 120  :   case PCRE_INFO_FIRSTTABLE:
; 121  :   *((const uschar **)where) =
; 122  :     (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
; 123  :       ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;

	test	esi, esi
	je	SHORT $LN31@pcre_fulli
	test	BYTE PTR [esi+4], 1
	je	SHORT $LN31@pcre_fulli
	mov	eax, DWORD PTR [ebx+4]
	add	eax, 8
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN31@pcre_fulli:

; 115  :   break;
; 116  : 
; 117  :   /* Make sure we pass back the pointer to the bit vector in the external
; 118  :   block, not the internal copy (with flipped integer fields). */
; 119  : 
; 120  :   case PCRE_INFO_FIRSTTABLE:
; 121  :   *((const uschar **)where) =
; 122  :     (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)?
; 123  :       ((const pcre_study_data *)extra_data->study_data)->start_bits : NULL;

	xor	eax, eax
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN9@pcre_fulli:

; 124  :   break;
; 125  : 
; 126  :   case PCRE_INFO_LASTLITERAL:
; 127  :   *((int *)where) =
; 128  :     ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1;

	test	BYTE PTR [eax+12], 4
	je	SHORT $LN33@pcre_fulli
	movzx	eax, WORD PTR [eax+22]
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN33@pcre_fulli:

; 124  :   break;
; 125  : 
; 126  :   case PCRE_INFO_LASTLITERAL:
; 127  :   *((int *)where) =
; 128  :     ((re->flags & PCRE_REQCHSET) != 0)? re->req_byte : -1;

	or	eax, -1
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN8@pcre_fulli:

; 129  :   break;
; 130  : 
; 131  :   case PCRE_INFO_NAMEENTRYSIZE:
; 132  :   *((int *)where) = re->name_entry_size;

	movzx	ecx, WORD PTR [eax+26]
	pop	ebx

; 153  :   break;
; 154  : 
; 155  :   case PCRE_INFO_HASCRORLF:
; 156  :   *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;

	mov	DWORD PTR [edi], ecx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN7@pcre_fulli:

; 133  :   break;
; 134  : 
; 135  :   case PCRE_INFO_NAMECOUNT:
; 136  :   *((int *)where) = re->name_count;

	movzx	edx, WORD PTR [eax+28]
	pop	ebx
	mov	DWORD PTR [edi], edx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN6@pcre_fulli:

; 137  :   break;
; 138  : 
; 139  :   case PCRE_INFO_NAMETABLE:
; 140  :   *((const uschar **)where) = (const uschar *)re + re->name_table_offset;

	movzx	ecx, WORD PTR [eax+24]
	add	ecx, eax
	pop	ebx

; 153  :   break;
; 154  : 
; 155  :   case PCRE_INFO_HASCRORLF:
; 156  :   *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;

	mov	DWORD PTR [edi], ecx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN5@pcre_fulli:
	pop	ebx

; 141  :   break;
; 142  : 
; 143  :   case PCRE_INFO_DEFAULT_TABLES:
; 144  :   *((const uschar **)where) = (const uschar *)(_pcre_default_tables);

	mov	DWORD PTR [edi], OFFSET __pcre_default_tables
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN4@pcre_fulli:

; 145  :   break;
; 146  : 
; 147  :   case PCRE_INFO_OKPARTIAL:
; 148  :   *((int *)where) = (re->flags & PCRE_NOPARTIAL) == 0;

	movzx	edx, WORD PTR [eax+12]
	not	edx
	and	edx, 1
	pop	ebx
	mov	DWORD PTR [edi], edx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN3@pcre_fulli:

; 149  :   break;
; 150  : 
; 151  :   case PCRE_INFO_JCHANGED:
; 152  :   *((int *)where) = (re->flags & PCRE_JCHANGED) != 0;

	movzx	eax, BYTE PTR [eax+12]
	shr	eax, 4
	and	eax, 1
	pop	ebx
	mov	DWORD PTR [edi], eax
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN2@pcre_fulli:

; 153  :   break;
; 154  : 
; 155  :   case PCRE_INFO_HASCRORLF:
; 156  :   *((int *)where) = (re->flags & PCRE_HASCRORLF) != 0;

	movzx	ecx, BYTE PTR [eax+12]
	shr	ecx, 5
	and	ecx, 1
	pop	ebx
	mov	DWORD PTR [edi], ecx
	pop	edi

; 160  :   }
; 161  : 
; 162  : return 0;

	xor	eax, eax
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN1@pcre_fulli:
	pop	ebx
	pop	edi

; 157  :   break;
; 158  : 
; 159  :   default: return PCRE_ERROR_BADOPTION;

	mov	eax, -3					; fffffffdH
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
$LN23@pcre_fulli:
	pop	edi

; 76   : 
; 77   : if (re == NULL || where == NULL) return PCRE_ERROR_NULL;

	mov	eax, -2					; fffffffeH
	pop	esi

; 163  : }

	add	esp, 80					; 00000050H
	ret	0
	npad	1
$LN37@pcre_fulli:
	DD	$LN16@pcre_fulli
	DD	$LN15@pcre_fulli
	DD	$LN13@pcre_fulli
	DD	$LN12@pcre_fulli
	DD	$LN11@pcre_fulli
	DD	$LN10@pcre_fulli
	DD	$LN9@pcre_fulli
	DD	$LN8@pcre_fulli
	DD	$LN7@pcre_fulli
	DD	$LN6@pcre_fulli
	DD	$LN14@pcre_fulli
	DD	$LN5@pcre_fulli
	DD	$LN4@pcre_fulli
	DD	$LN3@pcre_fulli
	DD	$LN2@pcre_fulli
_pcre_fullinfo ENDP
_TEXT	ENDS
END
