update for HEAD-2003091401
[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 /*
15  * @implemented
16  */
17 int _mbsncoll(const unsigned char *str1, const unsigned char *str2, size_t n)
18 {
19         unsigned char *s1 = (unsigned char *)str1;
20         unsigned char *s2 = (unsigned char *)str2;
21
22         unsigned short *short_s1, *short_s2;
23
24         int l1, l2;
25
26         if (n == 0)
27                 return 0;
28         do {
29                 
30                 if (*s1 == 0)
31                         break;  
32
33                 l1 = _ismbblead(*s1);
34                 l2 = _ismbblead(*s2);
35                 if ( !l1 &&  !l2  ) {
36
37                         if (*s1 != *s2)
38                                 return colldif(*s1, *s2);
39                         else {
40                                 s1 += 1;
41                                 s2 += 1;
42                                 n--;
43                         }
44                 }
45                 else if ( l1 && l2 ){
46                         short_s1 = (unsigned short *)s1;
47                         short_s2 = (unsigned short *)s2;
48                         if ( *short_s1 != *short_s2 )
49                                 return colldif(*short_s1, *short_s2);
50                         else {
51                                 s1 += 2;
52                                 s2 += 2;
53                                 n--;
54
55                         }
56                 }
57                 else
58                         return colldif(*s1, *s2);
59         } while (n > 0);
60         return 0;
61 }
62
63 /*
64  * @implemented
65  */
66 int _mbsnbcoll(const unsigned char *str1, const unsigned char *str2, size_t n)
67 {
68         unsigned char *s1 = (unsigned char *)str1;
69         unsigned char *s2 = (unsigned char *)str2;
70
71         unsigned short *short_s1, *short_s2;
72
73         int l1, l2;
74
75         if (n == 0)
76                 return 0;
77         do {
78                 
79                 if (*s1 == 0)
80                         break;  
81
82                 l1 = _ismbblead(*s1);
83                 l2 = _ismbblead(*s2);
84                 if ( !l1 &&  !l2  ) {
85
86                         if (*s1 != *s2)
87                                 return colldif(*s1, *s2);
88                         else {
89                                 s1 += 1;
90                                 s2 += 1;
91                                 n--;
92                         }
93                 }
94                 else if ( l1 && l2 ){
95                         short_s1 = (unsigned short *)s1;
96                         short_s2 = (unsigned short *)s2;
97                         if ( *short_s1 != *short_s2 )
98                                 return colldif(*short_s1, *short_s2);
99                         else {
100                                 s1 += 2;
101                                 s2 += 2;
102                                 n-=2;
103
104                         }
105                 }
106                 else
107                         return colldif(*s1, *s2);
108         } while (n > 0);
109         return 0;
110 }
111
112 int colldif(unsigned short c1, unsigned short c2)
113 {
114   return c1 - c2;
115 }