1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS system libraries 4 * FILE: lib/sdk/crt/mbstring/mbsncmp.c 5 * PURPOSE: Compares two strings to a maximum of n bytes or characters 6 * PROGRAMER: Ariadne 7 * UPDATE HISTORY: 8 * 12/04/99: Created 9 */ 10 11 #include <mbstring.h> 12 13 /* 14 * @implemented 15 */ 16 int _mbsncmp(const unsigned char *str1, const unsigned char *str2, size_t n) 17 { 18 unsigned char *s1 = (unsigned char *)str1; 19 unsigned char *s2 = (unsigned char *)str2; 20 21 unsigned short *short_s1, *short_s2; 22 23 int l1, l2; 24 25 if (n == 0) 26 return 0; 27 do { 28 29 if (*s1 == 0) 30 break; 31 32 l1 = _ismbblead(*s1); 33 l2 = _ismbblead(*s2); 34 if ( !l1 && !l2 ) { 35 36 if (*s1 != *s2) 37 return *s1 - *s2; 38 else { 39 s1 += 1; 40 s2 += 1; 41 n--; 42 } 43 } 44 else if ( l1 && l2 ){ 45 short_s1 = (unsigned short *)s1; 46 short_s2 = (unsigned short *)s2; 47 if ( *short_s1 != *short_s2 ) 48 return *short_s1 - *short_s2; 49 else { 50 s1 += 2; 51 s2 += 2; 52 n--; 53 54 } 55 } 56 else 57 return *s1 - *s2; 58 } while (n > 0); 59 return 0; 60 } 61 62 /* 63 * @implemented 64 */ 65 int _mbsnbcmp(const unsigned char *str1, const unsigned char *str2, size_t n) 66 { 67 unsigned char *s1 = (unsigned char *)str1; 68 unsigned char *s2 = (unsigned char *)str2; 69 70 unsigned short *short_s1, *short_s2; 71 72 int l1, l2; 73 74 if (n == 0) 75 return 0; 76 do { 77 78 if (*s1 == 0) 79 break; 80 81 l1 = _ismbblead(*s1); 82 l2 = _ismbblead(*s2); 83 if ( !l1 && !l2 ) { 84 85 if (*s1 != *s2) 86 return *s1 - *s2; 87 else { 88 s1 += 1; 89 s2 += 1; 90 n--; 91 } 92 } 93 else if ( l1 && l2 ){ 94 short_s1 = (unsigned short *)s1; 95 short_s2 = (unsigned short *)s2; 96 if ( *short_s1 != *short_s2 ) 97 return *short_s1 - *short_s2; 98 else { 99 s1 += 2; 100 s2 += 2; 101 n-=2; 102 103 } 104 } 105 else 106 return *s1 - *s2; 107 } while (n > 0); 108 return 0; 109 } 110