Remove deprecated BCollatorAddOn and implementations.
Leftover from initial import of the locale kit from OpenTracker. We are now using ICU for this, so specific add-ons for each language are not needed.
This commit is contained in:
parent
a19a18f553
commit
2b204c565c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2003-2011, Haiku, Inc.
|
* Copyright 2003-2017, Haiku, Inc.
|
||||||
* Distributed under the terms of the MIT Licence.
|
* Distributed under the terms of the MIT Licence.
|
||||||
*/
|
*/
|
||||||
#ifndef _COLLATOR_H_
|
#ifndef _COLLATOR_H_
|
||||||
@ -18,7 +18,6 @@ namespace U_ICU_NAMESPACE {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class BString;
|
class BString;
|
||||||
class BCollatorAddOn;
|
|
||||||
|
|
||||||
|
|
||||||
enum collator_strengths {
|
enum collator_strengths {
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
SubDir HAIKU_TOP src add-ons locale ;
|
SubDir HAIKU_TOP src add-ons locale ;
|
||||||
|
|
||||||
SubInclude HAIKU_TOP src add-ons locale catalogs ;
|
SubInclude HAIKU_TOP src add-ons locale catalogs ;
|
||||||
SubInclude HAIKU_TOP src add-ons locale collators ;
|
|
||||||
|
@ -1,272 +0,0 @@
|
|||||||
/*
|
|
||||||
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
|
||||||
** Distributed under the terms of the MIT License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <Collator.h>
|
|
||||||
#include <UnicodeChar.h>
|
|
||||||
#include <String.h>
|
|
||||||
#include <Message.h>
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
class FrenchCollator : public BCollatorAddOn {
|
|
||||||
struct compare_context {
|
|
||||||
compare_context(bool ignorePunctuation)
|
|
||||||
:
|
|
||||||
inputA(ignorePunctuation),
|
|
||||||
inputB(ignorePunctuation)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef BCollatorAddOn::input_context input_context;
|
|
||||||
|
|
||||||
const char *a;
|
|
||||||
const char *b;
|
|
||||||
input_context inputA;
|
|
||||||
input_context inputB;
|
|
||||||
size_t length;
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
FrenchCollator();
|
|
||||||
FrenchCollator(BMessage *archive);
|
|
||||||
~FrenchCollator();
|
|
||||||
|
|
||||||
virtual status_t GetSortKey(const char *string, BString *key, int8 strength,
|
|
||||||
bool ignorePunctuation);
|
|
||||||
virtual int Compare(const char *a, const char *b, int32 length, int8 strength,
|
|
||||||
bool ignorePunctuation);
|
|
||||||
|
|
||||||
// (un-)archiving API
|
|
||||||
virtual status_t Archive(BMessage *archive, bool deep) const;
|
|
||||||
static BArchivable *Instantiate(BMessage *archive);
|
|
||||||
|
|
||||||
private:
|
|
||||||
int CompareSecondary(compare_context &context);
|
|
||||||
|
|
||||||
typedef BCollatorAddOn _inherited;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const char *kSignature = "application/x-vnd.locale-collator.french";
|
|
||||||
|
|
||||||
|
|
||||||
inline char
|
|
||||||
uint32_to_char(uint32 c)
|
|
||||||
{
|
|
||||||
if (c > 255)
|
|
||||||
return 255;
|
|
||||||
|
|
||||||
return (char)c;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
FrenchCollator::FrenchCollator()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FrenchCollator::FrenchCollator(BMessage *archive)
|
|
||||||
: BCollatorAddOn(archive)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FrenchCollator::~FrenchCollator()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
FrenchCollator::CompareSecondary(compare_context &context)
|
|
||||||
{
|
|
||||||
if (context.length-- <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
uint32 charA = BUnicodeChar::ToLower(GetNextChar(&context.a, context.inputA));
|
|
||||||
uint32 charB = BUnicodeChar::ToLower(GetNextChar(&context.b, context.inputB));
|
|
||||||
|
|
||||||
// the two strings does have the same size when we get here
|
|
||||||
// (unfortunately, "length" is specified in bytes, not characters [if it was -1])
|
|
||||||
if (charA == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
int compare = CompareSecondary(context);
|
|
||||||
if (compare != 0)
|
|
||||||
return compare;
|
|
||||||
|
|
||||||
return (int32)charA - (int32)charB;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
FrenchCollator::GetSortKey(const char *string, BString *key, int8 strength,
|
|
||||||
bool ignorePunctuation)
|
|
||||||
{
|
|
||||||
if (strength == B_COLLATE_PRIMARY)
|
|
||||||
return _inherited::GetSortKey(string, key, strength, ignorePunctuation);
|
|
||||||
|
|
||||||
size_t length = strlen(string);
|
|
||||||
|
|
||||||
if (strength > B_COLLATE_QUATERNARY) {
|
|
||||||
key->SetTo(string, length);
|
|
||||||
return B_OK;
|
|
||||||
// what can we do about that?
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strength >= B_COLLATE_QUATERNARY) {
|
|
||||||
// the difference between tertiary and quaternary collation strength
|
|
||||||
// are usually a different handling of punctuation characters
|
|
||||||
ignorePunctuation = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t keyLength = PrimaryKeyLength(length) + length + 1;
|
|
||||||
// the primary key + the secondary key + separator char
|
|
||||||
if (strength != B_COLLATE_SECONDARY) {
|
|
||||||
keyLength += length + 1;
|
|
||||||
// the secondary key + the tertiary key + separator char
|
|
||||||
}
|
|
||||||
|
|
||||||
char *begin = key->LockBuffer(keyLength);
|
|
||||||
if (begin == NULL)
|
|
||||||
return B_NO_MEMORY;
|
|
||||||
|
|
||||||
char *buffer = PutPrimaryKey(string, begin, length, ignorePunctuation);
|
|
||||||
*buffer++ = '\01';
|
|
||||||
// separator
|
|
||||||
|
|
||||||
char *secondary = buffer;
|
|
||||||
|
|
||||||
input_context context(ignorePunctuation);
|
|
||||||
const char *source = string;
|
|
||||||
uint32 c;
|
|
||||||
for (uint32 i = 0; (c = GetNextChar(&source, context)) && i < length; i++) {
|
|
||||||
*buffer++ = uint32_to_char(BUnicodeChar::ToLower(c));
|
|
||||||
// we only support Latin-1 characters here
|
|
||||||
// ToDo: this creates a non UTF-8 sort key - is that what we want?
|
|
||||||
}
|
|
||||||
|
|
||||||
// reverse key
|
|
||||||
|
|
||||||
char *end = buffer - 1;
|
|
||||||
while (secondary < end) {
|
|
||||||
char c = secondary[0];
|
|
||||||
|
|
||||||
*secondary++ = end[0];
|
|
||||||
*end-- = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
// apply tertiary collation if necessary
|
|
||||||
|
|
||||||
if (strength != B_COLLATE_SECONDARY) {
|
|
||||||
*buffer++ = '\01';
|
|
||||||
// separator
|
|
||||||
|
|
||||||
input_context context(ignorePunctuation);
|
|
||||||
source = string;
|
|
||||||
uint32 c;
|
|
||||||
for (uint32 i = 0; (c = GetNextChar(&source, context)) && i < length; i++) {
|
|
||||||
// ToDo: same problem as above, no UTF-8 key
|
|
||||||
if (BUnicodeChar::IsLower(c))
|
|
||||||
*buffer++ = uint32_to_char(BUnicodeChar::ToUpper(c));
|
|
||||||
else
|
|
||||||
*buffer++ = uint32_to_char(BUnicodeChar::ToLower(c));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*buffer = '\0';
|
|
||||||
key->UnlockBuffer(buffer - begin);
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
FrenchCollator::Compare(const char *a, const char *b, int32 length, int8 strength,
|
|
||||||
bool ignorePunctuation)
|
|
||||||
{
|
|
||||||
int compare = _inherited::Compare(a, b, length, B_COLLATE_PRIMARY, ignorePunctuation);
|
|
||||||
if (strength == B_COLLATE_PRIMARY || compare != 0)
|
|
||||||
return compare;
|
|
||||||
else if (strength >= B_COLLATE_QUATERNARY) {
|
|
||||||
// the difference between tertiary and quaternary collation strength
|
|
||||||
// are usually a different handling of punctuation characters
|
|
||||||
ignorePunctuation = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
compare_context context(ignorePunctuation);
|
|
||||||
context.a = a;
|
|
||||||
context.b = b;
|
|
||||||
context.length = length;
|
|
||||||
|
|
||||||
switch (strength) {
|
|
||||||
case B_COLLATE_SECONDARY:
|
|
||||||
return CompareSecondary(context);
|
|
||||||
|
|
||||||
case B_COLLATE_TERTIARY:
|
|
||||||
case B_COLLATE_QUATERNARY:
|
|
||||||
{
|
|
||||||
// diacriticals can only change the order between equal strings
|
|
||||||
int32 compare = Compare(a, b, length, B_COLLATE_SECONDARY, ignorePunctuation);
|
|
||||||
if (compare != 0)
|
|
||||||
return compare;
|
|
||||||
|
|
||||||
for (int32 i = 0; i < length; i++) {
|
|
||||||
uint32 charA = GetNextChar(&a, context.inputA);
|
|
||||||
uint32 charB = GetNextChar(&b, context.inputB);
|
|
||||||
|
|
||||||
// the two strings does have the same size when we get here
|
|
||||||
if (charA == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (charA != charB)
|
|
||||||
return (int32)charB - (int32)charA;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case B_COLLATE_IDENTICAL:
|
|
||||||
default:
|
|
||||||
return strncmp(a, b, length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
FrenchCollator::Archive(BMessage *archive, bool deep) const
|
|
||||||
{
|
|
||||||
status_t status = BArchivable::Archive(archive, deep);
|
|
||||||
|
|
||||||
// add the add-on signature, so that the roster can load
|
|
||||||
// us on demand!
|
|
||||||
if (status == B_OK)
|
|
||||||
status = archive->AddString("add_on", kSignature);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BArchivable *
|
|
||||||
FrenchCollator::Instantiate(BMessage *archive)
|
|
||||||
{
|
|
||||||
if (validate_instantiation(archive, "FrenchCollator"))
|
|
||||||
return new FrenchCollator(archive);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" BCollatorAddOn *
|
|
||||||
instantiate_collator(void)
|
|
||||||
{
|
|
||||||
return new FrenchCollator();
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
/*
|
|
||||||
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
|
||||||
** Distributed under the terms of the MIT License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include <Collator.h>
|
|
||||||
#include <UnicodeChar.h>
|
|
||||||
#include <String.h>
|
|
||||||
#include <Message.h>
|
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
|
|
||||||
/** This implements a German DIN-2 collator. It replaces German umlauts
|
|
||||||
* like "ä" with "ae", or "ö" with "oe", etc.
|
|
||||||
* For all other characters, it does the same as its parent class,
|
|
||||||
* BCollatorAddOn.
|
|
||||||
* This method is intended for sorting names (while DIN-1 is intended
|
|
||||||
* for words, BCollatorAddOn is already compatible with that method).
|
|
||||||
* It is used in German telephone books, for example.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class CollatorDeutsch : public BCollatorAddOn {
|
|
||||||
public:
|
|
||||||
CollatorDeutsch();
|
|
||||||
CollatorDeutsch(BMessage *archive);
|
|
||||||
~CollatorDeutsch();
|
|
||||||
|
|
||||||
// (un-)archiving API
|
|
||||||
virtual status_t Archive(BMessage *archive, bool deep) const;
|
|
||||||
static BArchivable *Instantiate(BMessage *archive);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual uint32 GetNextChar(const char **string, input_context &context);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static const char *kSignature = "application/x-vnd.locale-collator.germanDIN-2";
|
|
||||||
|
|
||||||
|
|
||||||
CollatorDeutsch::CollatorDeutsch()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CollatorDeutsch::CollatorDeutsch(BMessage *archive)
|
|
||||||
: BCollatorAddOn(archive)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CollatorDeutsch::~CollatorDeutsch()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint32
|
|
||||||
CollatorDeutsch::GetNextChar(const char **string, input_context &context)
|
|
||||||
{
|
|
||||||
uint32 c = context.next_char;
|
|
||||||
if (c != 0) {
|
|
||||||
context.next_char = 0;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
|
||||||
c = BUnicodeChar::FromUTF8(string);
|
|
||||||
} while (context.ignore_punctuation
|
|
||||||
&& (BUnicodeChar::IsPunctuation(c) || BUnicodeChar::IsSpace(c)));
|
|
||||||
|
|
||||||
switch (c) {
|
|
||||||
case 223: // ß
|
|
||||||
context.next_char = 's';
|
|
||||||
return 's';
|
|
||||||
case 196: // Ae
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'A';
|
|
||||||
case 214: // Oe
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'O';
|
|
||||||
case 220: // Ue
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'U';
|
|
||||||
case 228: // ae
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'a';
|
|
||||||
case 246: // oe
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'o';
|
|
||||||
case 252: // ue
|
|
||||||
context.next_char = 'e';
|
|
||||||
return 'u';
|
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
CollatorDeutsch::Archive(BMessage *archive, bool deep) const
|
|
||||||
{
|
|
||||||
status_t status = BArchivable::Archive(archive, deep);
|
|
||||||
|
|
||||||
// add the add-on signature, so that the roster can load
|
|
||||||
// us on demand!
|
|
||||||
if (status == B_OK)
|
|
||||||
status = archive->AddString("add_on", kSignature);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BArchivable *
|
|
||||||
CollatorDeutsch::Instantiate(BMessage *archive)
|
|
||||||
{
|
|
||||||
if (validate_instantiation(archive, "CollatorDeutsch"))
|
|
||||||
return new CollatorDeutsch(archive);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" BCollatorAddOn *
|
|
||||||
instantiate_collator(void)
|
|
||||||
{
|
|
||||||
return new CollatorDeutsch();
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
SubDir HAIKU_TOP src add-ons locale collators ;
|
|
||||||
|
|
||||||
UsePublicHeaders locale ;
|
|
||||||
|
|
||||||
# Pseudo target to build all collator addons
|
|
||||||
NotFile LocaleKitCollatorAddons ;
|
|
||||||
Depends LocaleKitCollatorAddons
|
|
||||||
:
|
|
||||||
<collator-addon>GermanDIN-2
|
|
||||||
<collator-addon>French
|
|
||||||
;
|
|
||||||
|
|
||||||
Addon <collator-addon>GermanDIN-2
|
|
||||||
: GermanDIN-2.cpp
|
|
||||||
: be [ TargetLibsupc++ ]
|
|
||||||
;
|
|
||||||
|
|
||||||
Addon <collator-addon>French
|
|
||||||
: French.cpp
|
|
||||||
: be [ TargetLibsupc++ ]
|
|
||||||
;
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user