update for HEAD-2003021201
[reactos.git] / lib / msvcrt / mbstring / mbsncoll.c
1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS system libraries
4  * FILE:        lib/msvcrt/mbstring/mbsncoll.c
5  * PURPOSE:     
6  * PROGRAMER:   Boudewijn Dekker
7  * UPDATE HISTORY:
8  *              12/04/99: Created
9  */
10 #include <msvcrt/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 }