1 /*- 2 * Copyright (c) 1995 Alex Tatmanjants <alex@elvisti.kiev.ua> 3 * at Electronni Visti IA, Kiev, Ukraine. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $Id: strcoll.c,v 1.4 1995/04/16 22:43:45 ache Exp $ 28 */ 29 30 #include <stdlib.h> 31 #include <string.h> 32 #include <ctype.h> 33 #include "collate.h" 34 35 int 36 strcoll(s, s2) 37 const char *s, *s2; 38 { 39 int len, len2, prim, prim2, sec, sec2, ret, ret2; 40 char *tt, *t, *tt2, *t2; 41 42 if (__collate_load_error) { 43 register const u_char 44 *us1 = (const u_char *)s, 45 *us2 = (const u_char *)s2; 46 47 while (tolower(*us1) == tolower(*us2)) { 48 if (*us1 == '\0') 49 return (0); 50 if (isupper(*us1) && islower(*us2)) 51 return (-1); 52 else if (islower(*us1) && isupper(*us2)) 53 return (1); 54 *us1++; 55 *us2++; 56 } 57 return (tolower(*us1) - tolower(*us2)); 58 } 59 60 len = len2 = 1; 61 ret = ret2 = 0; 62 tt = t = __collate_substitute(s); 63 tt2 = t2 = __collate_substitute(s2); 64 while(*t && *t2) { 65 prim = prim2 = 0; 66 while(*t && !prim) { 67 __collate_lookup(t, &len, &prim, &sec); 68 t += len; 69 } 70 while(*t2 && !prim2) { 71 __collate_lookup(t2, &len2, &prim2, &sec2); 72 t2 += len2; 73 } 74 if(!prim || !prim2) 75 break; 76 if(prim != prim2) { 77 ret = prim - prim2; 78 goto end; 79 } 80 if(!ret2) 81 ret2 = sec - sec2; 82 } 83 if(!*t && *t2) 84 ret = -(int)((u_char)*t2); 85 else if(*t && !*t2) 86 ret = (u_char)*t; 87 else if(!*t && !*t2) 88 ret = ret2; 89 end: 90 free(tt); 91 free(tt2); 92 93 return ret; 94 } 95