70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include "pl-incl.h"
 | |
| #include "pl-ctype.h"
 | |
| 
 | |
| #ifndef HAVE_STRICMP
 | |
| int
 | |
| stricmp(const char *s1, const char *s2)
 | |
| { while(*s1 && makeLower(*s1) == makeLower(*s2))
 | |
|     s1++, s2++;
 | |
| 
 | |
|   return makeLower(*s1) - makeLower(*s2);
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #if !defined(HAVE_MBSCOLL) || !defined(HAVE_MBCASESCOLL)
 | |
| static void
 | |
| wstolower(wchar_t *w, size_t len)
 | |
| { wchar_t *e = &w[len];
 | |
| 
 | |
|   for( ; w<e; w++ )
 | |
|     *w = towlower(*w);
 | |
| }
 | |
| 
 | |
| static int
 | |
| int_mbscoll(const char *s1, const char *s2, int icase)
 | |
| { size_t l1 = strlen(s1);
 | |
|   size_t l2 = strlen(s2);
 | |
|   wchar_t *w1;
 | |
|   wchar_t *w2;
 | |
|   int ml1, ml2;
 | |
|   mbstate_t mbs;
 | |
|   int rc;
 | |
| 
 | |
|   if ( l1 < 1024 && (w1 = alloca(sizeof(wchar_t)*(l1+1))) )
 | |
|   { ml1 = FALSE;
 | |
|   } else
 | |
|   { w1 = PL_malloc(sizeof(wchar_t)*(l1+1));
 | |
|     ml1 = TRUE;
 | |
|   }
 | |
|   if ( l2 < 1024 && (w2 = alloca(sizeof(wchar_t)*(l2+1))) )
 | |
|   { ml2 = FALSE;
 | |
|   } else
 | |
|   { w2 = PL_malloc(sizeof(wchar_t)*(l2+1));
 | |
|     ml2 = TRUE;
 | |
|   }
 | |
| 
 | |
|   memset(&mbs, 0, sizeof(mbs));
 | |
|   if ( mbsrtowcs(w1, &s1, l1+1, &mbs) == (size_t)-1 )
 | |
|   { rc = -2;
 | |
|     goto out;
 | |
|   }
 | |
|   if ( mbsrtowcs(w2, &s2, l2+1, &mbs) == (size_t)-1 )
 | |
|   { rc = 2;
 | |
|     goto out;
 | |
|   }
 | |
|   if ( icase )
 | |
|   { wstolower(w1, l1);
 | |
|     wstolower(w2, l2);
 | |
|   }
 | |
| 
 | |
|   rc = wcscoll(w1, w2);
 | |
| 
 | |
| out:
 | |
|   if ( ml1 ) PL_free(w1);
 | |
|   if ( ml2 ) PL_free(w2);
 | |
| 
 | |
|   return rc;
 | |
| }
 | |
| #endif
 |