73 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			73 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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |