| 881 | |
| 882 | |
| 883 | BOOL IsUnicode ( const char *pBuffer, int cb, LPBOOL lpbBOM, LPBOOL lpbReverse ) |
| 884 | { |
| 885 | int i = 0xFFFF; |
| 886 | BOOL bIsTextUnicode; |
| 887 | BOOL bHasBOM; |
| 888 | BOOL bHasRBOM; |
| 889 | if ( !pBuffer || cb < 2 ) { |
| 890 | return FALSE; |
| 891 | } |
| 892 | if ( !bSkipUnicodeDetection ) { |
| 893 | bIsTextUnicode = IsTextUnicode ( pBuffer, cb, &i ); |
| 894 | } else { |
| 895 | bIsTextUnicode = FALSE; |
| 896 | } |
| 897 | bHasBOM = ( * ( ( UNALIGNED PWCHAR ) pBuffer ) == 0xFEFF ); |
| 898 | bHasRBOM = ( * ( ( UNALIGNED PWCHAR ) pBuffer ) == 0xFFFE ); |
| 899 | if ( i == 0xFFFF ) { // i doesn't seem to have been modified ... |
| 900 | i = 0; |
| 901 | } |
| 902 | if ( bIsTextUnicode || bHasBOM || bHasRBOM || |
| 903 | ( ( i & ( IS_TEXT_UNICODE_UNICODE_MASK | IS_TEXT_UNICODE_REVERSE_MASK ) ) && |
| 904 | ! ( ( i & IS_TEXT_UNICODE_UNICODE_MASK ) && ( i & IS_TEXT_UNICODE_REVERSE_MASK ) ) && |
| 905 | ! ( i & IS_TEXT_UNICODE_ODD_LENGTH ) && |
| 906 | ! ( i & IS_TEXT_UNICODE_ILLEGAL_CHARS && ! ( i & IS_TEXT_UNICODE_REVERSE_SIGNATURE ) ) && |
| 907 | ! ( ( i & IS_TEXT_UNICODE_REVERSE_MASK ) == IS_TEXT_UNICODE_REVERSE_STATISTICS ) ) ) { |
| 908 | if ( lpbBOM ) |
| 909 | *lpbBOM = ( bHasBOM || bHasRBOM || |
| 910 | ( i & ( IS_TEXT_UNICODE_SIGNATURE | IS_TEXT_UNICODE_REVERSE_SIGNATURE ) ) ) |
| 911 | ? TRUE : FALSE; |
| 912 | if ( lpbReverse ) { |
| 913 | *lpbReverse = ( bHasRBOM || ( i & IS_TEXT_UNICODE_REVERSE_MASK ) ) ? TRUE : FALSE; |
| 914 | } |
| 915 | return TRUE; |
| 916 | } else { |
| 917 | return FALSE; |
| 918 | } |
| 919 | } |
| 920 | |
| 921 | |
| 922 | BOOL IsUTF8 ( const char *pTest, int nLength ) |