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