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

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

INCLUDELIB LIBCMTD
INCLUDELIB OLDNAMES

PUBLIC	__pcre_valid_utf8
; Function compile flags: /Ogtpy
; File d:\source code\nc lib\regex\pcre_valid_utf8.c
;	COMDAT __pcre_valid_utf8
_TEXT	SEGMENT
_string$ = 8						; size = 4
_length$ = 12						; size = 4
__pcre_valid_utf8 PROC					; COMDAT

; 77   : #ifdef SUPPORT_UTF8
; 78   : register const uschar *p;
; 79   : 
; 80   : if (length < 0)
; 81   :   {
; 82   :   for (p = string; *p != 0; p++);
; 83   :   length = p - string;
; 84   :   }
; 85   : 
; 86   : for (p = string; length-- > 0; p++)
; 87   :   {
; 88   :   register int ab;
; 89   :   register int c = *p;
; 90   :   if (c < 128) continue;
; 91   :   if (c < 0xc0) return p - string;
; 92   :   ab = _pcre_utf8_table4[c & 0x3f];     /* Number of additional bytes */
; 93   :   if (length < ab || ab > 3) return p - string;
; 94   :   length -= ab;
; 95   : 
; 96   :   /* Check top bits in the second byte */
; 97   :   if ((*(++p) & 0xc0) != 0x80) return p - string;
; 98   : 
; 99   :   /* Check for overlong sequences for each different length, and for the
; 100  :   excluded range 0xd000 to 0xdfff.  */
; 101  : 
; 102  :   switch (ab)
; 103  :     {
; 104  :     /* Check for xx00 000x (overlong sequence) */
; 105  : 
; 106  :     case 1:
; 107  :     if ((c & 0x3e) == 0) return p - string;
; 108  :     continue;   /* We know there aren't any more bytes to check */
; 109  : 
; 110  :     /* Check for 1110 0000, xx0x xxxx (overlong sequence) or
; 111  :                  1110 1101, 1010 xxxx (0xd000 - 0xdfff) */
; 112  : 
; 113  :     case 2:
; 114  :     if ((c == 0xe0 && (*p & 0x20) == 0) ||
; 115  :         (c == 0xed && *p >= 0xa0))
; 116  :       return p - string;
; 117  :     break;
; 118  : 
; 119  :     /* Check for 1111 0000, xx00 xxxx (overlong sequence) or
; 120  :        greater than 0x0010ffff (f4 8f bf bf) */
; 121  : 
; 122  :     case 3:
; 123  :     if ((c == 0xf0 && (*p & 0x30) == 0) ||
; 124  :         (c > 0xf4 ) ||
; 125  :         (c == 0xf4 && *p > 0x8f))
; 126  :       return p - string;
; 127  :     break;
; 128  : 
; 129  : #if 0
; 130  :     /* These cases can no longer occur, as we restrict to a maximum of four
; 131  :     bytes nowadays. Leave the code here in case we ever want to add an option
; 132  :     for longer sequences. */
; 133  : 
; 134  :     /* Check for 1111 1000, xx00 0xxx */
; 135  :     case 4:
; 136  :     if (c == 0xf8 && (*p & 0x38) == 0) return p - string;
; 137  :     break;
; 138  : 
; 139  :     /* Check for leading 0xfe or 0xff, and then for 1111 1100, xx00 00xx */
; 140  :     case 5:
; 141  :     if (c == 0xfe || c == 0xff ||
; 142  :        (c == 0xfc && (*p & 0x3c) == 0)) return p - string;
; 143  :     break;
; 144  : #endif
; 145  : 
; 146  :     }
; 147  : 
; 148  :   /* Check for valid bytes after the 2nd, if any; all must start 10 */
; 149  :   while (--ab > 0)
; 150  :     {
; 151  :     if ((*(++p) & 0xc0) != 0x80) return p - string;
; 152  :     }
; 153  :   }
; 154  : #endif
; 155  : 
; 156  : return -1;

	or	eax, -1

; 157  : }

	ret	0
__pcre_valid_utf8 ENDP
_TEXT	ENDS
END
