mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-18 11:05:48 +08:00
Use ucdata (very experimental)
This commit is contained in:
parent
f9690a37bb
commit
a4fac87687
@ -128,6 +128,9 @@ Package=<4>
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name passwd
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name ucgendat
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
@ -512,6 +515,9 @@ Package=<4>
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name libslapd
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name liblunicode
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
@ -548,6 +554,9 @@ Package=<4>
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name backldbm
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name liblunicode
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
@ -587,6 +596,9 @@ Package=<4>
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name libslapd
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name liblunicode
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
@ -623,6 +635,9 @@ Package=<4>
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name libslapd
|
||||
End Project Dependency
|
||||
Begin Project Dependency
|
||||
Project_Dep_Name liblunicode
|
||||
End Project Dependency
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
@ -642,6 +657,18 @@ Package=<4>
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "ucgendat"=..\libraries\liblunicode\ucgetdat.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "ud"=..\clients\ud\ud.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
|
@ -128,6 +128,10 @@ LIB32=link.exe -lib
|
||||
# Name "liblunicode - Win32 Single Release"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\include\ldap_pvt_uc.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ucdata\ucdata.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
@ -136,6 +140,10 @@ SOURCE=.\ucdata\ucdata.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ucstr.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ure\ure.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
@ -24,13 +24,7 @@
|
||||
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef lint
|
||||
#ifdef __GNUC__
|
||||
static char rcsid[] __attribute__ ((unused)) = "$Id: ucdata.c,v 1.3 1999/08/23 16:14:09 mleisher Exp $";
|
||||
#else
|
||||
static char rcsid[] = "$Id: ucdata.c,v 1.3 1999/08/23 16:14:09 mleisher Exp $";
|
||||
#endif
|
||||
#endif
|
||||
/* $Id: ucdata.c,v 1.3 1999/08/23 16:14:09 mleisher Exp $" */
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
@ -61,12 +55,14 @@ typedef struct {
|
||||
* A simple array of 32-bit masks for lookup.
|
||||
*/
|
||||
static unsigned long masks32[32] = {
|
||||
0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020,
|
||||
0x00000040, 0x00000080, 0x00000100, 0x00000200, 0x00000400, 0x00000800,
|
||||
0x00001000, 0x00002000, 0x00004000, 0x00008000, 0x00010000, 0x00020000,
|
||||
0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,
|
||||
0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000,
|
||||
0x40000000, 0x80000000
|
||||
0x00000001UL, 0x00000002UL, 0x00000004UL, 0x00000008UL,
|
||||
0x00000010UL, 0x00000020UL, 0x00000040UL, 0x00000080UL,
|
||||
0x00000100UL, 0x00000200UL, 0x00000400UL, 0x00000800UL,
|
||||
0x00001000UL, 0x00002000UL, 0x00004000UL, 0x00008000UL,
|
||||
0x00010000UL, 0x00020000UL, 0x00040000UL, 0x00080000UL,
|
||||
0x00100000UL, 0x00200000UL, 0x00400000UL, 0x00800000UL,
|
||||
0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
|
||||
0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL
|
||||
};
|
||||
|
||||
#define endian_short(cc) (((cc) >> 8) | (((cc) & 0xff) << 8))
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* $OpenLDAP$
|
||||
/*
|
||||
* Copyright 1999 Computing Research Labs, New Mexico State University
|
||||
*
|
||||
@ -19,13 +20,7 @@
|
||||
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef lint
|
||||
#ifdef __GNUC__
|
||||
static char rcsid[] __attribute__ ((unused)) = "$Id: ucgendat.c,v 1.3 1999/10/07 20:49:56 mleisher Exp $";
|
||||
#else
|
||||
static char rcsid[] = "$Id: ucgendat.c,v 1.3 1999/10/07 20:49:56 mleisher Exp $";
|
||||
#endif
|
||||
#endif
|
||||
/* $Id: ucgendat.c,v 1.3 1999/10/07 20:49:56 mleisher Exp $" */
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
|
145
libraries/liblunicode/ucgetdat.dsp
Normal file
145
libraries/liblunicode/ucgetdat.dsp
Normal file
@ -0,0 +1,145 @@
|
||||
# Microsoft Developer Studio Project File - Name="ucgendat" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 5.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
||||
|
||||
CFG=ucgendat - Win32 Single Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ucgendat.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ucgendat.mak" CFG="ucgendat - Win32 Single Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "ucgendat - Win32 Release" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ucgendat - Win32 Debug" (based on "Win32 (x86) Console Application")
|
||||
!MESSAGE "ucgendat - Win32 Single Debug" (based on\
|
||||
"Win32 (x86) Console Application")
|
||||
!MESSAGE "ucgendat - Win32 Single Release" (based on\
|
||||
"Win32 (x86) Console Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "ucgendat - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "..\..\Release"
|
||||
# PROP Intermediate_Dir "..\..\Release\ucgendat"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
||||
# ADD LINK32 oldap32.lib olber32.lib sasl.lib libsasl.lib ws2_32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\Release"
|
||||
|
||||
!ELSEIF "$(CFG)" == "ucgendat - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "ucgendat_"
|
||||
# PROP BASE Intermediate_Dir "ucgendat_"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "..\..\Debug"
|
||||
# PROP Intermediate_Dir "..\..\Debug\ucgendat"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 oldap32.lib olber32.lib libsasl.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\Debug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "ucgendat - Win32 Single Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "ucgendat_"
|
||||
# PROP BASE Intermediate_Dir "ucgendat_"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "..\..\SDebug"
|
||||
# PROP Intermediate_Dir "..\..\SDebug\ucgendat"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 oldap32.lib olber32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\Debug"
|
||||
# ADD LINK32 oldap32.lib olber32.lib libsasl.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"..\..\SDebug"
|
||||
|
||||
!ELSEIF "$(CFG)" == "ucgendat - Win32 Single Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "ucgendat0"
|
||||
# PROP BASE Intermediate_Dir "ucgendat0"
|
||||
# PROP BASE Ignore_Export_Lib 0
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "..\..\SRelease"
|
||||
# PROP Intermediate_Dir "..\..\SRelease\ucgendat"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 oldap32.lib olber32.lib ws2_32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\Release"
|
||||
# ADD LINK32 oldap32.lib olber32.lib sasl.lib libsasl.lib ws2_32.lib /nologo /subsystem:console /machine:I386 /libpath:"..\..\SRelease"
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "ucgendat - Win32 Release"
|
||||
# Name "ucgendat - Win32 Debug"
|
||||
# Name "ucgendat - Win32 Single Debug"
|
||||
# Name "ucgendat - Win32 Single Release"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ucdata\ucgendat.c
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
78
libraries/liblunicode/ucstr.c
Normal file
78
libraries/liblunicode/ucstr.c
Normal file
@ -0,0 +1,78 @@
|
||||
#include "portable.h"
|
||||
|
||||
#include <ldap_pvt_uc.h>
|
||||
|
||||
int ucstrncmp(
|
||||
const ldap_unicode_t *u1,
|
||||
const ldap_unicode_t *u2,
|
||||
ber_len_t n )
|
||||
{
|
||||
for(; 0 < n; ++u1, ++u2, --n ) {
|
||||
if( *u1 != *u2 ) {
|
||||
return *u1 < *u2 ? -1 : +1;
|
||||
}
|
||||
if ( *u1 == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ucstrncasecmp(
|
||||
const ldap_unicode_t *u1,
|
||||
const ldap_unicode_t *u2,
|
||||
ber_len_t n )
|
||||
{
|
||||
for(; 0 < n; ++u1, ++u2, --n ) {
|
||||
ldap_unicode_t uu1 = uctoupper( *u1 );
|
||||
ldap_unicode_t uu2 = uctoupper( *u2 );
|
||||
|
||||
if( uu1 != uu2 ) {
|
||||
return uu1 < uu2 ? -1 : +1;
|
||||
}
|
||||
if ( uu1 == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ldap_unicode_t * ucstrnchr(
|
||||
const ldap_unicode_t *u,
|
||||
ber_len_t n,
|
||||
ldap_unicode_t c )
|
||||
{
|
||||
for(; 0 < n; ++u, --n ) {
|
||||
if( *u == c ) {
|
||||
return (ldap_unicode_t *) u;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ldap_unicode_t * ucstrncasechr(
|
||||
const ldap_unicode_t *u,
|
||||
ber_len_t n,
|
||||
ldap_unicode_t c )
|
||||
{
|
||||
c = uctoupper( c );
|
||||
for(; 0 < n; ++u, --n ) {
|
||||
if( uctoupper( *u ) == c ) {
|
||||
return (ldap_unicode_t *) u;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void ucstr2upper(
|
||||
ldap_unicode_t *u,
|
||||
ber_len_t n )
|
||||
{
|
||||
for(; 0 < n; ++u, --n ) {
|
||||
*u = uctoupper( *u );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -25,9 +25,7 @@
|
||||
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Id: ure.c,v 1.2 1999/09/21 15:47:43 mleisher Exp $";
|
||||
#endif
|
||||
/* $Id: ure.c,v 1.2 1999/09/21 15:47:43 mleisher Exp $" */
|
||||
|
||||
#include "portable.h"
|
||||
|
||||
|
@ -25,12 +25,16 @@
|
||||
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
|
||||
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Id: urestubs.c,v 1.2 1999/09/21 15:47:44 mleisher Exp $";
|
||||
#endif
|
||||
/* $Id: urestubs.c,v 1.2 1999/09/21 15:47:44 mleisher Exp $" */
|
||||
|
||||
#include "ure.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# include "../ucdata/ucdata.h"
|
||||
#else
|
||||
# include "ucdata.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This file contains stub routines needed by the URE package to test
|
||||
* character properties and other Unicode implementation specific details.
|
||||
@ -42,9 +46,53 @@ static char rcsid[] = "$Id: urestubs.c,v 1.2 1999/09/21 15:47:44 mleisher Exp $"
|
||||
*/
|
||||
ucs4_t _ure_tolower(ucs4_t c)
|
||||
{
|
||||
return c;
|
||||
return uctoupper(c);
|
||||
}
|
||||
|
||||
static struct maskmap {
|
||||
unsigned long mask1;
|
||||
unsigned long mask2;
|
||||
} masks[32] = {
|
||||
{ UC_MN, 0 }, /* _URE_NONSPACING */
|
||||
{ UC_MC, 0 }, /* _URE_COMBINING */
|
||||
{ UC_ND, 0 }, /* _URE_NUMDIGIT */
|
||||
{ UC_NL|UC_NO, 0 }, /* _URE_NUMOTHER */
|
||||
{ UC_ZS, 0 }, /* _URE_SPACESEP */
|
||||
{ UC_ZL, 0 }, /* _URE_LINESEP */
|
||||
{ UC_ZP, 0 }, /* _URE_PARASEP */
|
||||
{ UC_CC, 0 }, /* _URE_CNTRL */
|
||||
{ UC_CO, 0 }, /* _URE_PUA */
|
||||
|
||||
{ UC_LU, 0 }, /* _URE_UPPER */
|
||||
{ UC_LL, 0 }, /* _URE_LOWER */
|
||||
{ UC_LT, 0 }, /* _URE_TITLE */
|
||||
{ UC_LM, 0 }, /* _URE_MODIFIER */
|
||||
{ UC_LO, 0 }, /* _URE_OTHERLETTER */
|
||||
{ UC_PD, 0 }, /* _URE_DASHPUNCT */
|
||||
{ UC_PS, 0 }, /* _URE_OPENPUNCT */
|
||||
{ UC_PC, 0 }, /* _URE_CLOSEPUNCT */
|
||||
{ UC_PO, 0 }, /* _URE_OTHERPUNCT */
|
||||
{ UC_SM, 0 }, /* _URE_MATHSYM */
|
||||
{ UC_SC, 0 }, /* _URE_CURRENCYSYM */
|
||||
{ UC_SO, 0 }, /* _URE_OTHERSYM */
|
||||
|
||||
{ UC_L, 0 }, /* _URE_LTR */
|
||||
{ UC_R, 0 }, /* _URE_RTL */
|
||||
|
||||
{ 0, UC_EN }, /* _URE_EURONUM */
|
||||
{ 0, UC_ES }, /* _URE_EURONUMSEP */
|
||||
{ 0, UC_ET }, /* _URE_EURONUMTERM */
|
||||
{ 0, UC_AN }, /* _URE_ARABNUM */
|
||||
{ 0, UC_CS }, /* _URE_COMMONSEP */
|
||||
|
||||
{ 0, UC_B }, /* _URE_BLOCKSEP */
|
||||
{ 0, UC_S }, /* _URE_SEGMENTSEP */
|
||||
|
||||
{ 0, UC_WS }, /* _URE_WHITESPACE */
|
||||
{ 0, UC_ON } /* _URE_OTHERNEUT */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* This routine takes a set of URE character property flags (see ure.h) along
|
||||
* with a character and tests to see if the character has one or more of those
|
||||
@ -53,5 +101,15 @@ ucs4_t _ure_tolower(ucs4_t c)
|
||||
int
|
||||
_ure_matches_properties(unsigned long props, ucs4_t c)
|
||||
{
|
||||
return 1;
|
||||
int i;
|
||||
unsigned long mask1=0, mask2=0;
|
||||
|
||||
for( i=0; i<32; i++ ) {
|
||||
if( props & (1 << i) ) {
|
||||
mask1 |= masks[i].mask1;
|
||||
mask2 |= masks[i].mask2;
|
||||
}
|
||||
}
|
||||
|
||||
return ucisprop( mask1, mask2, c );
|
||||
}
|
||||
|
@ -15,6 +15,7 @@
|
||||
|
||||
#include "slap.h"
|
||||
#include "ldap_pvt.h"
|
||||
#include "ldap_pvt_uc.h"
|
||||
#include "lutil_md5.h"
|
||||
|
||||
/* recycled validatation routines */
|
||||
@ -46,7 +47,7 @@
|
||||
#define objectIdentifierMatch numericStringMatch
|
||||
#define integerMatch numericStringMatch
|
||||
#define telephoneNumberMatch numericStringMatch
|
||||
#define telephoneNumberSubstringsMatch caseIgnoreIA5SubstringsMatch
|
||||
#define telephoneNumberSubstringsMatch caseIgnoreSubstringsMatch
|
||||
#define generalizedTimeMatch numericStringMatch
|
||||
#define generalizedTimeOrderingMatch numericStringMatch
|
||||
#define uniqueMemberMatch dnMatch
|
||||
@ -348,62 +349,6 @@ booleanMatch(
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int
|
||||
UTF8casecmp(
|
||||
struct berval *right,
|
||||
struct berval *left )
|
||||
{
|
||||
ber_len_t r, l;
|
||||
int rlen, llen;
|
||||
ldap_unicode_t ru, lu;
|
||||
ldap_unicode_t ruu, luu;
|
||||
|
||||
for( r=0, l=0;
|
||||
r < right->bv_len && l < left->bv_len;
|
||||
r+=rlen, l+=llen )
|
||||
{
|
||||
/*
|
||||
* XXYYZ: we convert to ucs4 even though -llunicode
|
||||
* expects ucs2 in an unsigned long
|
||||
*/
|
||||
ru = ldap_utf8_to_ucs4( &right->bv_val[r] );
|
||||
if( ru == LDAP_UCS4_INVALID ) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
lu = ldap_utf8_to_ucs4( &left->bv_val[l] );
|
||||
if( lu == LDAP_UCS4_INVALID ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
ruu = uctoupper( ru );
|
||||
luu = uctoupper( lu );
|
||||
|
||||
if( ruu > luu ) {
|
||||
return 1;
|
||||
} else if( luu > ruu ) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
rlen = LDAP_UTF8_CHARLEN( &right->bv_val[r] );
|
||||
llen = LDAP_UTF8_CHARLEN( &left->bv_val[l] );
|
||||
}
|
||||
|
||||
if( r < right->bv_len ) {
|
||||
/* less left */
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( l < left->bv_len ) {
|
||||
/* less right */
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int
|
||||
UTF8StringValidate(
|
||||
Syntax *syntax,
|
||||
@ -432,80 +377,84 @@ UTF8StringValidate(
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
#define UNICODE2LEN(n) ((n)*sizeof(ldap_unicode_t))
|
||||
#define LEN2UNICODE(n) ((n)/sizeof(ldap_unicode_t))
|
||||
|
||||
#define SLAP_INDEX_SUBSTR_UMINLEN UNICODE2LEN(SLAP_INDEX_SUBSTR_MINLEN)
|
||||
#define SLAP_INDEX_SUBSTR_UMAXLEN UNICODE2LEN(SLAP_INDEX_SUBSTR_MAXLEN)
|
||||
#define SLAP_INDEX_SUBSTR_USTEP UNICODE2LEN(SLAP_INDEX_SUBSTR_STEP)
|
||||
|
||||
static int
|
||||
UTF8StringNormalize(
|
||||
Syntax *syntax,
|
||||
struct berval *val,
|
||||
struct berval **normalized )
|
||||
{
|
||||
ber_len_t bcount;
|
||||
ber_len_t ucount;
|
||||
int len, space;
|
||||
char *u;
|
||||
struct berval *newval;
|
||||
char *p, *q, *s;
|
||||
ldap_unicode_t *uc;
|
||||
|
||||
newval = ch_malloc( sizeof( struct berval ) );
|
||||
if( !val->bv_len ) return LDAP_INVALID_SYNTAX;
|
||||
|
||||
p = val->bv_val;
|
||||
u = val->bv_val;
|
||||
ucount = 0;
|
||||
space = 1;
|
||||
|
||||
/* Ignore initial whitespace */
|
||||
while ( ldap_utf8_isspace( p ) ) {
|
||||
LDAP_UTF8_INCR( p );
|
||||
for( bcount = val->bv_len; bcount > 0; bcount-=len, u+=len ) {
|
||||
/* get the length indicated by the first byte */
|
||||
len = LDAP_UTF8_CHARLEN( u );
|
||||
|
||||
/* should not be zero */
|
||||
if( len == 0 ) return LDAP_INVALID_SYNTAX;
|
||||
|
||||
if( ldap_utf8_isspace( u ) ) {
|
||||
if( space ) continue;
|
||||
} else {
|
||||
space=1;
|
||||
}
|
||||
|
||||
ucount++;
|
||||
}
|
||||
|
||||
if( *p == '\0' ) {
|
||||
ch_free( newval );
|
||||
if( ucount <= 1 ) {
|
||||
return LDAP_INVALID_SYNTAX;
|
||||
}
|
||||
|
||||
newval->bv_val = ch_strdup( p );
|
||||
p = q = newval->bv_val;
|
||||
s = NULL;
|
||||
if( space ) {
|
||||
ucount--;
|
||||
}
|
||||
|
||||
while ( *p ) {
|
||||
int len;
|
||||
newval = ch_malloc( sizeof( struct berval ) );
|
||||
newval->bv_val = ch_malloc( UNICODE2LEN(ucount+1) );
|
||||
uc = (ldap_unicode_t *) newval->bv_val;
|
||||
|
||||
if ( ldap_utf8_isspace( p ) ) {
|
||||
len = LDAP_UTF8_COPY(q,p);
|
||||
s=q;
|
||||
p+=len;
|
||||
q+=len;
|
||||
u = val->bv_val;
|
||||
ucount = 0;
|
||||
space = 1;
|
||||
|
||||
/* Ignore the extra whitespace */
|
||||
while ( ldap_utf8_isspace( p ) ) {
|
||||
LDAP_UTF8_INCR( p );
|
||||
}
|
||||
for( bcount = val->bv_len; bcount > 0; bcount-=len, u+=len ) {
|
||||
/* get the length indicated by the first byte */
|
||||
len = LDAP_UTF8_CHARLEN( u );
|
||||
|
||||
/* should not be zero */
|
||||
if( len == 0 ) return LDAP_INVALID_SYNTAX;
|
||||
|
||||
if( ldap_utf8_isspace( u ) ) {
|
||||
if( space ) continue;
|
||||
} else {
|
||||
len = LDAP_UTF8_COPY(q,p);
|
||||
s=NULL;
|
||||
p+=len;
|
||||
q+=len;
|
||||
space=1;
|
||||
}
|
||||
|
||||
uc[ucount++] = ldap_utf8_to_unicode( u );
|
||||
}
|
||||
|
||||
assert( *newval->bv_val );
|
||||
assert( newval->bv_val < p );
|
||||
assert( p >= q );
|
||||
|
||||
/* cannot start with a space */
|
||||
assert( !ldap_utf8_isspace(newval->bv_val) );
|
||||
|
||||
/*
|
||||
* If the string ended in space, backup the pointer one
|
||||
* position. One is enough because the above loop collapsed
|
||||
* all whitespace to a single space.
|
||||
*/
|
||||
|
||||
if ( s != NULL ) {
|
||||
q = s;
|
||||
}
|
||||
|
||||
/* cannot end with a space */
|
||||
assert( !ldap_utf8_isspace( LDAP_UTF8_PREV(q) ) );
|
||||
|
||||
/* null terminate */
|
||||
*q = '\0';
|
||||
|
||||
newval->bv_len = q - newval->bv_val;
|
||||
*normalized = newval;
|
||||
if( space ) ucount--;
|
||||
uc[ucount] = 0;
|
||||
|
||||
newval->bv_len = UNICODE2LEN(ucount);
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
@ -521,9 +470,9 @@ caseExactMatch(
|
||||
int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
|
||||
|
||||
if( match == 0 ) {
|
||||
match = strncmp( value->bv_val,
|
||||
((struct berval *) assertedValue)->bv_val,
|
||||
value->bv_len );
|
||||
match = ucstrncmp( (ldap_unicode_t *) value->bv_val,
|
||||
(ldap_unicode_t *) ((struct berval *) assertedValue)->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
}
|
||||
|
||||
*matchp = match;
|
||||
@ -564,8 +513,10 @@ caseExactSubstringsMatch(
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncmp( sub->sa_initial->bv_val, left.bv_val,
|
||||
sub->sa_initial->bv_len );
|
||||
match = ucstrncmp(
|
||||
(ldap_unicode_t *) sub->sa_initial->bv_val,
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
LEN2UNICODE(sub->sa_initial->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
goto done;
|
||||
@ -582,9 +533,10 @@ caseExactSubstringsMatch(
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncmp( sub->sa_final->bv_val,
|
||||
&left.bv_val[left.bv_len - sub->sa_final->bv_len],
|
||||
sub->sa_final->bv_len );
|
||||
match = ucstrncmp(
|
||||
(ldap_unicode_t *) sub->sa_final->bv_val,
|
||||
(ldap_unicode_t *) &left.bv_val[left.bv_len - sub->sa_final->bv_len],
|
||||
LEN2UNICODE(sub->sa_final->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
goto done;
|
||||
@ -610,7 +562,11 @@ retry:
|
||||
continue;
|
||||
}
|
||||
|
||||
p = strchr( left.bv_val, *sub->sa_any[i]->bv_val );
|
||||
p = (char *) ucstrnchr(
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
LEN2UNICODE(left.bv_len),
|
||||
((ldap_unicode_t *) sub->sa_any[i]->bv_val)[0] );
|
||||
|
||||
|
||||
if( p == NULL ) {
|
||||
match = 1;
|
||||
@ -634,13 +590,14 @@ retry:
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncmp( left.bv_val,
|
||||
sub->sa_any[i]->bv_val,
|
||||
sub->sa_any[i]->bv_len );
|
||||
match = ucstrncmp(
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
(ldap_unicode_t *) sub->sa_any[i]->bv_val,
|
||||
LEN2UNICODE(sub->sa_any[i]->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
left.bv_val++;
|
||||
left.bv_len--;
|
||||
left.bv_val += UNICODE2LEN(1);
|
||||
left.bv_len -= UNICODE2LEN(1);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
@ -777,31 +734,34 @@ int caseExactSubstringsIndexer(
|
||||
nkeys=0;
|
||||
for( i=0; values[i] != NULL; i++ ) {
|
||||
/* count number of indices to generate */
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_UMINLEN ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1);
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
} else {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_ANY ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1);
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
} else {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -824,21 +784,21 @@ int caseExactSubstringsIndexer(
|
||||
struct berval *value;
|
||||
|
||||
value = values[i];
|
||||
if( value->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
|
||||
if( value->bv_len < SLAP_INDEX_SUBSTR_UMINLEN ) continue;
|
||||
|
||||
if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
|
||||
( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
|
||||
( value->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) )
|
||||
{
|
||||
char pre = SLAP_INDEX_SUBSTR_PREFIX;
|
||||
max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
|
||||
max = value->bv_len -
|
||||
( SLAP_INDEX_SUBSTR_UMAXLEN - UNICODE2LEN(1));
|
||||
|
||||
for( j=0; j<max; j++ ) {
|
||||
for( j=0; j<max; j+=UNICODE2LEN(1) ) {
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
lutil_MD5Update( &MD5context,
|
||||
prefix->bv_val, prefix->bv_len );
|
||||
}
|
||||
|
||||
lutil_MD5Update( &MD5context,
|
||||
&pre, sizeof( pre ) );
|
||||
lutil_MD5Update( &MD5context,
|
||||
@ -846,18 +806,17 @@ int caseExactSubstringsIndexer(
|
||||
lutil_MD5Update( &MD5context,
|
||||
mr->smr_oid, mlen );
|
||||
lutil_MD5Update( &MD5context,
|
||||
&value->bv_val[j],
|
||||
SLAP_INDEX_SUBSTR_MAXLEN );
|
||||
&value->bv_val[j], SLAP_INDEX_SUBSTR_UMAXLEN );
|
||||
lutil_MD5Final( MD5digest, &MD5context );
|
||||
|
||||
keys[nkeys++] = ber_bvdup( &digest );
|
||||
}
|
||||
}
|
||||
|
||||
max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
max = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
|
||||
for( j=SLAP_INDEX_SUBSTR_UMINLEN; j<=max; j+=UNICODE2LEN(1) ) {
|
||||
char pre;
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
|
||||
@ -934,7 +893,7 @@ int caseExactSubstringsFilter(
|
||||
struct berval digest;
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
nkeys++;
|
||||
}
|
||||
@ -942,16 +901,16 @@ int caseExactSubstringsFilter(
|
||||
if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
|
||||
ber_len_t i;
|
||||
for( i=0; sa->sa_any[i] != NULL; i++ ) {
|
||||
if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
/* don't bother accounting for stepping */
|
||||
nkeys += sa->sa_any[i]->bv_len -
|
||||
nkeys += LEN2UNICODE(sa->sa_any[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
nkeys++;
|
||||
}
|
||||
@ -971,13 +930,13 @@ int caseExactSubstringsFilter(
|
||||
nkeys = 0;
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL && sa->sa_initial != NULL &&
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
|
||||
value = sa->sa_initial;
|
||||
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1000,18 +959,18 @@ int caseExactSubstringsFilter(
|
||||
if( flags & SLAP_INDEX_SUBSTR_ANY && sa->sa_any != NULL ) {
|
||||
ber_len_t i, j;
|
||||
pre = SLAP_INDEX_SUBSTR_PREFIX;
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN;
|
||||
|
||||
for( i=0; sa->sa_any[i] != NULL; i++ ) {
|
||||
if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
value = sa->sa_any[i];
|
||||
|
||||
for(j=0;
|
||||
j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
|
||||
j += SLAP_INDEX_SUBSTR_STEP )
|
||||
j <= value->bv_len - SLAP_INDEX_SUBSTR_UMAXLEN;
|
||||
j += SLAP_INDEX_SUBSTR_USTEP )
|
||||
{
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1025,7 +984,7 @@ int caseExactSubstringsFilter(
|
||||
lutil_MD5Update( &MD5context,
|
||||
mr->smr_oid, mlen );
|
||||
lutil_MD5Update( &MD5context,
|
||||
&value->bv_val[j], klen );
|
||||
&value->bv_val[j], klen );
|
||||
lutil_MD5Final( MD5digest, &MD5context );
|
||||
|
||||
keys[nkeys++] = ber_bvdup( &digest );
|
||||
@ -1034,13 +993,13 @@ int caseExactSubstringsFilter(
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_FINAL && sa->sa_final != NULL &&
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
|
||||
value = sa->sa_final;
|
||||
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1080,19 +1039,16 @@ caseIgnoreMatch(
|
||||
struct berval *value,
|
||||
void *assertedValue )
|
||||
{
|
||||
#if 0
|
||||
*matchp = UTF8casecmp( value, (struct berval *) assertedValue );
|
||||
#else
|
||||
int match = value->bv_len - ((struct berval *) assertedValue)->bv_len;
|
||||
|
||||
if( match == 0 ) {
|
||||
match = strncasecmp( value->bv_val,
|
||||
((struct berval *) assertedValue)->bv_val,
|
||||
value->bv_len );
|
||||
match = ucstrncasecmp(
|
||||
(ldap_unicode_t *) value->bv_val,
|
||||
(ldap_unicode_t *) ((struct berval *) assertedValue)->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
}
|
||||
|
||||
*matchp = match;
|
||||
#endif
|
||||
return LDAP_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1130,8 +1086,10 @@ caseIgnoreSubstringsMatch(
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncasecmp( sub->sa_initial->bv_val, left.bv_val,
|
||||
sub->sa_initial->bv_len );
|
||||
match = ucstrncasecmp(
|
||||
(ldap_unicode_t *) sub->sa_initial->bv_val,
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
LEN2UNICODE(sub->sa_initial->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
goto done;
|
||||
@ -1148,9 +1106,10 @@ caseIgnoreSubstringsMatch(
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncasecmp( sub->sa_final->bv_val,
|
||||
&left.bv_val[left.bv_len - sub->sa_final->bv_len],
|
||||
sub->sa_final->bv_len );
|
||||
match = ucstrncasecmp(
|
||||
(ldap_unicode_t *) sub->sa_final->bv_val,
|
||||
(ldap_unicode_t *) &left.bv_val[left.bv_len - sub->sa_final->bv_len],
|
||||
LEN2UNICODE(sub->sa_final->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
goto done;
|
||||
@ -1176,7 +1135,10 @@ retry:
|
||||
continue;
|
||||
}
|
||||
|
||||
p = strcasechr( left.bv_val, *sub->sa_any[i]->bv_val );
|
||||
p = (char *) ucstrncasechr(
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
LEN2UNICODE(left.bv_len),
|
||||
((ldap_unicode_t *) sub->sa_any[i]->bv_val)[0] );
|
||||
|
||||
if( p == NULL ) {
|
||||
match = 1;
|
||||
@ -1200,13 +1162,14 @@ retry:
|
||||
goto done;
|
||||
}
|
||||
|
||||
match = strncasecmp( left.bv_val,
|
||||
sub->sa_any[i]->bv_val,
|
||||
sub->sa_any[i]->bv_len );
|
||||
match = ucstrncasecmp(
|
||||
(ldap_unicode_t *) left.bv_val,
|
||||
(ldap_unicode_t *) sub->sa_any[i]->bv_val,
|
||||
LEN2UNICODE(sub->sa_any[i]->bv_len) );
|
||||
|
||||
if( match != 0 ) {
|
||||
left.bv_val++;
|
||||
left.bv_len--;
|
||||
left.bv_val += UNICODE2LEN(1);
|
||||
left.bv_len -= UNICODE2LEN(1);
|
||||
|
||||
goto retry;
|
||||
}
|
||||
@ -1254,7 +1217,8 @@ int caseIgnoreIndexer(
|
||||
|
||||
for( i=0; values[i] != NULL; i++ ) {
|
||||
struct berval *value = ber_bvdup( values[i] );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1270,7 +1234,6 @@ int caseIgnoreIndexer(
|
||||
lutil_MD5Final( MD5digest, &MD5context );
|
||||
|
||||
ber_bvfree( value );
|
||||
|
||||
keys[i] = ber_bvdup( &digest );
|
||||
}
|
||||
|
||||
@ -1302,7 +1265,8 @@ int caseIgnoreFilter(
|
||||
mlen = strlen( mr->smr_oid );
|
||||
|
||||
value = ber_bvdup( (struct berval *) assertValue );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
keys = ch_malloc( sizeof( struct berval * ) * 2 );
|
||||
|
||||
@ -1351,31 +1315,34 @@ int caseIgnoreSubstringsIndexer(
|
||||
nkeys=0;
|
||||
for( i=0; values[i] != NULL; i++ ) {
|
||||
/* count number of indices to generate */
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) {
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_UMINLEN ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1);
|
||||
} else {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_ANY ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
}
|
||||
}
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_FINAL ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( values[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
nkeys += SLAP_INDEX_SUBSTR_MAXLEN -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1);
|
||||
} else {
|
||||
nkeys += values[i]->bv_len - ( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
nkeys += LEN2UNICODE(values[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MINLEN - 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1397,24 +1364,25 @@ int caseIgnoreSubstringsIndexer(
|
||||
int j,max;
|
||||
struct berval *value;
|
||||
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_MINLEN ) continue;
|
||||
if( values[i]->bv_len < SLAP_INDEX_SUBSTR_UMINLEN ) continue;
|
||||
|
||||
value = ber_bvdup( values[i] );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
if( ( flags & SLAP_INDEX_SUBSTR_ANY ) &&
|
||||
( value->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) )
|
||||
( value->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) )
|
||||
{
|
||||
char pre = SLAP_INDEX_SUBSTR_PREFIX;
|
||||
max = value->bv_len - ( SLAP_INDEX_SUBSTR_MAXLEN - 1);
|
||||
max = value->bv_len -
|
||||
( SLAP_INDEX_SUBSTR_UMAXLEN - UNICODE2LEN(1));
|
||||
|
||||
for( j=0; j<max; j++ ) {
|
||||
for( j=0; j<max; j+=UNICODE2LEN(1) ) {
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
lutil_MD5Update( &MD5context,
|
||||
prefix->bv_val, prefix->bv_len );
|
||||
}
|
||||
|
||||
lutil_MD5Update( &MD5context,
|
||||
&pre, sizeof( pre ) );
|
||||
lutil_MD5Update( &MD5context,
|
||||
@ -1423,17 +1391,17 @@ int caseIgnoreSubstringsIndexer(
|
||||
mr->smr_oid, mlen );
|
||||
lutil_MD5Update( &MD5context,
|
||||
&value->bv_val[j],
|
||||
SLAP_INDEX_SUBSTR_MAXLEN );
|
||||
SLAP_INDEX_SUBSTR_UMAXLEN );
|
||||
lutil_MD5Final( MD5digest, &MD5context );
|
||||
|
||||
keys[nkeys++] = ber_bvdup( &digest );
|
||||
}
|
||||
}
|
||||
|
||||
max = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
max = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
for( j=SLAP_INDEX_SUBSTR_MINLEN; j<=max; j++ ) {
|
||||
for( j=SLAP_INDEX_SUBSTR_UMINLEN; j<=max; j+=UNICODE2LEN(1) ) {
|
||||
char pre;
|
||||
|
||||
if( flags & SLAP_INDEX_SUBSTR_INITIAL ) {
|
||||
@ -1512,7 +1480,7 @@ int caseIgnoreSubstringsFilter(
|
||||
struct berval digest;
|
||||
|
||||
if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
nkeys++;
|
||||
}
|
||||
@ -1520,16 +1488,16 @@ int caseIgnoreSubstringsFilter(
|
||||
if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
|
||||
ber_len_t i;
|
||||
for( i=0; sa->sa_any[i] != NULL; i++ ) {
|
||||
if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( sa->sa_any[i]->bv_len >= SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
/* don't bother accounting for stepping */
|
||||
nkeys += sa->sa_any[i]->bv_len -
|
||||
nkeys += LEN2UNICODE(sa->sa_any[i]->bv_len) -
|
||||
( SLAP_INDEX_SUBSTR_MAXLEN - 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
nkeys++;
|
||||
}
|
||||
@ -1549,14 +1517,15 @@ int caseIgnoreSubstringsFilter(
|
||||
nkeys = 0;
|
||||
|
||||
if((flags & SLAP_INDEX_SUBSTR_INITIAL) && sa->sa_initial != NULL &&
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_initial->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
pre = SLAP_INDEX_SUBSTR_INITIAL_PREFIX;
|
||||
value = ber_bvdup( sa->sa_initial );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1580,19 +1549,20 @@ int caseIgnoreSubstringsFilter(
|
||||
if((flags & SLAP_INDEX_SUBSTR_ANY) && sa->sa_any != NULL ) {
|
||||
ber_len_t i, j;
|
||||
pre = SLAP_INDEX_SUBSTR_PREFIX;
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN;
|
||||
|
||||
for( i=0; sa->sa_any[i] != NULL; i++ ) {
|
||||
if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_MAXLEN ) {
|
||||
if( sa->sa_any[i]->bv_len < SLAP_INDEX_SUBSTR_UMAXLEN ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
value = ber_bvdup( sa->sa_any[i] );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
for(j=0;
|
||||
j <= value->bv_len - SLAP_INDEX_SUBSTR_MAXLEN;
|
||||
j += SLAP_INDEX_SUBSTR_STEP )
|
||||
j <= value->bv_len - SLAP_INDEX_SUBSTR_UMAXLEN;
|
||||
j += SLAP_INDEX_SUBSTR_USTEP )
|
||||
{
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -1617,14 +1587,15 @@ int caseIgnoreSubstringsFilter(
|
||||
}
|
||||
|
||||
if((flags & SLAP_INDEX_SUBSTR_FINAL) && sa->sa_final != NULL &&
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_MINLEN )
|
||||
sa->sa_final->bv_len >= SLAP_INDEX_SUBSTR_UMINLEN )
|
||||
{
|
||||
pre = SLAP_INDEX_SUBSTR_FINAL_PREFIX;
|
||||
value = ber_bvdup( sa->sa_final );
|
||||
ldap_pvt_str2upper( value->bv_val );
|
||||
ucstr2upper( (ldap_unicode_t *) value->bv_val,
|
||||
LEN2UNICODE(value->bv_len) );
|
||||
|
||||
klen = SLAP_INDEX_SUBSTR_MAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_MAXLEN : value->bv_len;
|
||||
klen = SLAP_INDEX_SUBSTR_UMAXLEN < value->bv_len
|
||||
? SLAP_INDEX_SUBSTR_UMAXLEN : value->bv_len;
|
||||
|
||||
lutil_MD5Init( &MD5context );
|
||||
if( prefix != NULL && prefix->bv_len > 0 ) {
|
||||
@ -2164,7 +2135,6 @@ int caseExactIA5SubstringsIndexer(
|
||||
lutil_MD5Update( &MD5context,
|
||||
prefix->bv_val, prefix->bv_len );
|
||||
}
|
||||
|
||||
lutil_MD5Update( &MD5context,
|
||||
&pre, sizeof( pre ) );
|
||||
lutil_MD5Update( &MD5context,
|
||||
@ -2736,7 +2706,6 @@ int caseIgnoreIA5SubstringsIndexer(
|
||||
lutil_MD5Update( &MD5context,
|
||||
prefix->bv_val, prefix->bv_len );
|
||||
}
|
||||
|
||||
lutil_MD5Update( &MD5context,
|
||||
&pre, sizeof( pre ) );
|
||||
lutil_MD5Update( &MD5context,
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
#include "slap.h"
|
||||
#include "ldap_pvt.h"
|
||||
#include "../libraries/liblunicode/ucdata.h"
|
||||
#include "ldap_pvt_uc.h"
|
||||
|
||||
int schema_init_done = 0;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user