xref: /freebsd/lib/libc/locale/collcmp.c (revision 883a3266d1879a3c6161c27eb85dd1996b9857e9)
12eecfbacSAndrey A. Chernov /*
22eecfbacSAndrey A. Chernov  * Copyright (C) 1996 by Andrey A. Chernov, Moscow, Russia.
32eecfbacSAndrey A. Chernov  * All rights reserved.
42eecfbacSAndrey A. Chernov  *
52eecfbacSAndrey A. Chernov  * Redistribution and use in source and binary forms, with or without
62eecfbacSAndrey A. Chernov  * modification, are permitted provided that the following conditions
72eecfbacSAndrey A. Chernov  * are met:
82eecfbacSAndrey A. Chernov  * 1. Redistributions of source code must retain the above copyright
92eecfbacSAndrey A. Chernov  *    notice, this list of conditions and the following disclaimer.
102eecfbacSAndrey A. Chernov  * 2. Redistributions in binary form must reproduce the above copyright
112eecfbacSAndrey A. Chernov  *    notice, this list of conditions and the following disclaimer in the
122eecfbacSAndrey A. Chernov  *    documentation and/or other materials provided with the distribution.
132eecfbacSAndrey A. Chernov  *
142eecfbacSAndrey A. Chernov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
152eecfbacSAndrey A. Chernov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
162eecfbacSAndrey A. Chernov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172eecfbacSAndrey A. Chernov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
182eecfbacSAndrey A. Chernov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
192eecfbacSAndrey A. Chernov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
202eecfbacSAndrey A. Chernov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
212eecfbacSAndrey A. Chernov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
222eecfbacSAndrey A. Chernov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
232eecfbacSAndrey A. Chernov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
242eecfbacSAndrey A. Chernov  * SUCH DAMAGE.
252eecfbacSAndrey A. Chernov  */
262eecfbacSAndrey A. Chernov 
272eecfbacSAndrey A. Chernov #include <ctype.h>
282eecfbacSAndrey A. Chernov #include <string.h>
29883a3266SAndrey A. Chernov #include <locale.h>
30883a3266SAndrey A. Chernov 
31883a3266SAndrey A. Chernov /* will be removed ***************************/
322eecfbacSAndrey A. Chernov #include "collate.h"
332eecfbacSAndrey A. Chernov 
342eecfbacSAndrey A. Chernov int __collcmp (c1, c2)
35883a3266SAndrey A. Chernov 	unsigned char c1, c2;
36883a3266SAndrey A. Chernov {
37883a3266SAndrey A. Chernov 	return collate_range_cmp (c1, c2);
38883a3266SAndrey A. Chernov }
39883a3266SAndrey A. Chernov /* will be removed ***************************/
40883a3266SAndrey A. Chernov 
41883a3266SAndrey A. Chernov int collate_range_cmp (c1, c2)
42883a3266SAndrey A. Chernov 	int c1, c2;
432eecfbacSAndrey A. Chernov {
442eecfbacSAndrey A. Chernov 	static char s1[2], s2[2];
452eecfbacSAndrey A. Chernov 
46883a3266SAndrey A. Chernov 	c1 &= UCHAR_MAX;
47883a3266SAndrey A. Chernov 	c2 &= UCHAR_MAX;
482eecfbacSAndrey A. Chernov 	if (c1 == c2)
492eecfbacSAndrey A. Chernov 		return (0);
502eecfbacSAndrey A. Chernov 	if (   (isascii(c1) && isascii(c2))
512eecfbacSAndrey A. Chernov 	    || (!isalpha(c1) && !isalpha(c2))
522eecfbacSAndrey A. Chernov 	   )
53883a3266SAndrey A. Chernov 		return (c1 - c2);
542eecfbacSAndrey A. Chernov 	if (isalpha(c1) && !isalpha(c2)) {
552eecfbacSAndrey A. Chernov 		if (isupper(c1))
56883a3266SAndrey A. Chernov 			return ('A' - c2);
572eecfbacSAndrey A. Chernov 		else
58883a3266SAndrey A. Chernov 			return ('a' - c2);
592eecfbacSAndrey A. Chernov 	} else if (isalpha(c2) && !isalpha(c1)) {
602eecfbacSAndrey A. Chernov 		if (isupper(c2))
61883a3266SAndrey A. Chernov 			return (c1 - 'A');
622eecfbacSAndrey A. Chernov 		else
63883a3266SAndrey A. Chernov 			return (c1 - 'a');
642eecfbacSAndrey A. Chernov 	}
652eecfbacSAndrey A. Chernov 	if (isupper(c1) && islower(c2))
662eecfbacSAndrey A. Chernov 		return (-1);
672eecfbacSAndrey A. Chernov 	else if (islower(c1) && isupper(c2))
682eecfbacSAndrey A. Chernov 		return (1);
69883a3266SAndrey A. Chernov 	s1[0] = c1;
70883a3266SAndrey A. Chernov 	s2[0] = c2;
712eecfbacSAndrey A. Chernov 	return strcoll(s1, s2);
722eecfbacSAndrey A. Chernov }
73